diff --git a/NTwain/Internals/InternalMessageLoopHook.cs b/NTwain/Internals/InternalMessageLoopHook.cs
index 28379c8..6b622b9 100644
--- a/NTwain/Internals/InternalMessageLoopHook.cs
+++ b/NTwain/Internals/InternalMessageLoopHook.cs
@@ -9,7 +9,7 @@ using System.Windows.Threading;
namespace NTwain.Internals
{
- sealed class InternalMessageLoopHook : MessageLoopHook
+ sealed class InternalMessageLoopHook : MessageLoopHook
{
Dispatcher _dispatcher;
WindowsHook _hook;
@@ -55,14 +55,14 @@ namespace NTwain.Internals
}
}
- internal override void BeginInvoke(Action action)
+ public override void BeginInvoke(Action action)
{
if (_dispatcher == null) { throw new InvalidOperationException(Resources.MsgLoopUnavailble); }
_dispatcher.BeginInvoke(DispatcherPriority.Normal, action);
}
- internal override void Invoke(Action action)
+ public override void Invoke(Action action)
{
if (_dispatcher == null) { throw new InvalidOperationException(Resources.MsgLoopUnavailble); }
diff --git a/NTwain/MessageLoopHooks.cs b/NTwain/MessageLoopHooks.cs
index 30d236d..fd3fcd5 100644
--- a/NTwain/MessageLoopHooks.cs
+++ b/NTwain/MessageLoopHooks.cs
@@ -16,7 +16,11 @@ namespace NTwain
internal abstract void Start(IWinMessageFilter filter);
internal abstract void Stop();
- internal virtual void BeginInvoke(Action action)
+ ///
+ /// Asynchronously invokes the specified action on the message loop thread.
+ ///
+ /// The action.
+ public virtual void BeginInvoke(Action action)
{
if (SyncContext == null)
{
@@ -30,7 +34,12 @@ namespace NTwain
}, null);
}
}
- internal virtual void Invoke(Action action)
+
+ ///
+ /// Synchronously invokes the specified action on the message loop thread.
+ ///
+ /// The action.
+ public virtual void Invoke(Action action)
{
if (SyncContext == null)
{
diff --git a/NTwain/Properties/VersionInfo.cs b/NTwain/Properties/VersionInfo.cs
index 7be4146..be3ac3c 100644
--- a/NTwain/Properties/VersionInfo.cs
+++ b/NTwain/Properties/VersionInfo.cs
@@ -14,6 +14,6 @@ namespace NTwain
// keep this same in majors releases
public const string Release = "2.0.0.0";
// change this for each nuget release
- public const string Build = "2.0.4";
+ public const string Build = "2.0.5";
}
}
\ No newline at end of file
diff --git a/NTwain/TwainSession.cs b/NTwain/TwainSession.cs
index d34ebd8..60736a6 100644
--- a/NTwain/TwainSession.cs
+++ b/NTwain/TwainSession.cs
@@ -54,12 +54,18 @@ namespace NTwain
internal static TwainSource GetSourceInstance(ITwainSessionInternal session, TWIdentity sourceId)
{
+ TwainSource source = null;
var key = string.Format(CultureInfo.InvariantCulture, "{0}|{1}|{2}", sourceId.Manufacturer, sourceId.ProductFamily, sourceId.ProductName);
if (__ownedSources.ContainsKey(key))
{
- return __ownedSources[key];
+ source = __ownedSources[key];
+ source.Session = session;
}
- return __ownedSources[key] = new TwainSource(session, sourceId);
+ else
+ {
+ __ownedSources[key] = source = new TwainSource(session, sourceId);
+ }
+ return source;
}
///
diff --git a/NTwain/TwainSource.Caps.cs b/NTwain/TwainSource.Caps.cs
index 7b01ad1..3948aae 100644
--- a/NTwain/TwainSource.Caps.cs
+++ b/NTwain/TwainSource.Caps.cs
@@ -18,7 +18,7 @@ namespace NTwain
QuerySupport retVal = QuerySupport.None;
using (TWCapability cap = new TWCapability(capId))
{
- var rc = _session.DGControl.Capability.QuerySupport(cap);
+ var rc = Session.DGControl.Capability.QuerySupport(cap);
if (rc == ReturnCode.Success)
{
var read = CapabilityReader.ReadValue(cap);
@@ -41,7 +41,7 @@ namespace NTwain
{
using (TWCapability cap = new TWCapability(capId))
{
- var rc = _session.DGControl.Capability.GetCurrent(cap);
+ var rc = Session.DGControl.Capability.GetCurrent(cap);
if (rc == ReturnCode.Success)
{
var read = CapabilityReader.ReadValue(cap);
@@ -82,7 +82,7 @@ namespace NTwain
var list = new List
public partial class TwainSource
{
- ITwainSessionInternal _session;
+ internal ITwainSessionInternal Session { get; set; }
internal TwainSource(ITwainSessionInternal session, TWIdentity sourceId)
{
- _session = session;
+ Session = session;
Identity = sourceId;
}
@@ -32,11 +32,11 @@ namespace NTwain
public ReturnCode Open()
{
var rc = ReturnCode.Failure;
- _session.MessageLoopHook.Invoke(() =>
+ Session.MessageLoopHook.Invoke(() =>
{
Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Thread {0}: OpenSource.", Thread.CurrentThread.ManagedThreadId));
- rc = _session.DGControl.Identity.OpenDS(this);
+ rc = Session.DGControl.Identity.OpenDS(this);
});
return rc;
}
@@ -48,11 +48,11 @@ namespace NTwain
public ReturnCode Close()
{
var rc = ReturnCode.Failure;
- _session.MessageLoopHook.Invoke(() =>
+ Session.MessageLoopHook.Invoke(() =>
{
Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Thread {0}: CloseSource.", Thread.CurrentThread.ManagedThreadId));
- rc = _session.DGControl.Identity.CloseDS();
+ rc = Session.DGControl.Identity.CloseDS();
if (rc == ReturnCode.Success)
{
SupportedCaps = null;
@@ -71,7 +71,7 @@ namespace NTwain
///
public ReturnCode StartTransfer(SourceEnableMode mode, bool modal, IntPtr windowHandle)
{
- return _session.EnableSource(mode, modal, windowHandle);
+ return Session.EnableSource(mode, modal, windowHandle);
}
///
@@ -81,7 +81,7 @@ namespace NTwain
public TWStatus GetStatus()
{
TWStatus stat;
- _session.DGControl.Status.GetSource(out stat);
+ Session.DGControl.Status.GetSource(out stat);
return stat;
}
///
@@ -91,7 +91,7 @@ namespace NTwain
public TWStatusUtf8 GetStatusUtf8()
{
TWStatusUtf8 stat;
- _session.DGControl.StatusUtf8.GetSource(out stat);
+ Session.DGControl.StatusUtf8.GetSource(out stat);
return stat;
}
@@ -170,7 +170,7 @@ namespace NTwain
{
get
{
- if (_supportedCaps == null && _session.State > 3)
+ if (_supportedCaps == null && Session.State > 3)
{
_supportedCaps = CapGetValues(CapabilityId.CapSupportedCaps).CastToEnum(false);
}
@@ -191,7 +191,7 @@ namespace NTwain
{
get
{
- return _session.DGControl;
+ return Session.DGControl;
}
}
@@ -202,7 +202,7 @@ namespace NTwain
{
get
{
- return _session.DGImage;
+ return Session.DGImage;
}
}
@@ -213,7 +213,7 @@ namespace NTwain
{
get
{
- return _session.DGCustom;
+ return Session.DGCustom;
}
}
@@ -232,7 +232,7 @@ namespace NTwain
///// Name of the property.
//protected void OnPropertyChanged(string propertyName)
//{
- // var syncer = _session.SynchronizationContext;
+ // var syncer = Session.SynchronizationContext;
// if (syncer == null)
// {
// try
diff --git a/Tests/Tester.WPF/App.xaml b/Tests/Tester.WPF/App.xaml
index d733b8c..9ea9427 100644
--- a/Tests/Tester.WPF/App.xaml
+++ b/Tests/Tester.WPF/App.xaml
@@ -1,7 +1,7 @@
+ StartupUri="Dummy.xaml">
diff --git a/Tests/Tester.WPF/Dummy.xaml b/Tests/Tester.WPF/Dummy.xaml
new file mode 100644
index 0000000..9304408
--- /dev/null
+++ b/Tests/Tester.WPF/Dummy.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/Tests/Tester.WPF/Dummy.xaml.cs b/Tests/Tester.WPF/Dummy.xaml.cs
new file mode 100644
index 0000000..8c055a9
--- /dev/null
+++ b/Tests/Tester.WPF/Dummy.xaml.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace Tester.WPF
+{
+ ///
+ /// Interaction logic for Dummy.xaml
+ ///
+ public partial class Dummy : Window
+ {
+ public Dummy()
+ {
+ InitializeComponent();
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ new MainWindow().ShowDialog();
+ }
+ }
+}
diff --git a/Tests/Tester.WPF/MainWindow.xaml.cs b/Tests/Tester.WPF/MainWindow.xaml.cs
index 72a3198..c5b167b 100644
--- a/Tests/Tester.WPF/MainWindow.xaml.cs
+++ b/Tests/Tester.WPF/MainWindow.xaml.cs
@@ -4,6 +4,7 @@ using NTwain;
using NTwain.Data;
using System;
using System.ComponentModel;
+using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
@@ -51,13 +52,18 @@ namespace Tester.WPF
});
}
}
-
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ e.Cancel = _twainVM.State > 4;
+ base.OnClosing(e);
+ }
protected override void OnClosed(EventArgs e)
{
if (_twainVM.State == 4)
{
_twainVM.CurrentSource.Close();
}
+ _twainVM.Close();
base.OnClosed(e);
}
@@ -68,6 +74,8 @@ namespace Tester.WPF
// use this for internal msg loop
//var rc = _twainVM.Open();
// use this to hook into current app loop
+
+
var rc = _twainVM.Open(new WpfMessageLoopHook(new WindowInteropHelper(this).Handle));
if (rc == ReturnCode.Success)
@@ -82,6 +90,15 @@ namespace Tester.WPF
private void SrcList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
+
+ //var test = new NTwain.Internals.InternalMessageLoopHook();
+ //test.StartTest();
+ //test.BeginInvoke(() =>
+ //{
+ // Debug.WriteLine("doodle");
+ // test.StopTest();
+ //});
+
if (_twainVM.State == 4)
{
_twainVM.CurrentSource.Close();
diff --git a/Tests/Tester.WPF/Tester.WPF.csproj b/Tests/Tester.WPF/Tester.WPF.csproj
index b7b2cd3..54e4e0b 100644
--- a/Tests/Tester.WPF/Tester.WPF.csproj
+++ b/Tests/Tester.WPF/Tester.WPF.csproj
@@ -80,7 +80,14 @@
MSBuild:Compile
Designer
+
+ Dummy.xaml
+
+
+ Designer
+ MSBuild:Compile
+
MSBuild:Compile
Designer
diff --git a/Tests/Tester.WPF/ViewModels/TwainVM.cs b/Tests/Tester.WPF/ViewModels/TwainVM.cs
index 8153351..51ece2a 100644
--- a/Tests/Tester.WPF/ViewModels/TwainVM.cs
+++ b/Tests/Tester.WPF/ViewModels/TwainVM.cs
@@ -3,6 +3,7 @@ using GalaSoft.MvvmLight.Messaging;
using NTwain;
using NTwain.Data;
using System;
+using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows.Media;
@@ -76,12 +77,23 @@ namespace Tester.WPF
var fileSetup = new TWSetupFileXfer
{
Format = wantFormat,
- FileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.tif")
+ FileName = GetUniqueName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test", ".tif")
};
var rc = this.CurrentSource.DGControl.SetupFileXfer.Set(fileSetup);
}
}
+ private string GetUniqueName(string dir, string name, string ext)
+ {
+ var filePath = Path.Combine(dir, name + ext);
+ int next = 1;
+ while (File.Exists(filePath))
+ {
+ filePath = Path.Combine(dir, string.Format("{0} ({1}){2}", name, next++, ext));
+ }
+ return filePath;
+ }
+
protected override void OnDataTransferred(DataTransferredEventArgs e)
{
ImageSource img = null;
diff --git a/Tests/Tester.Winform/TestForm.cs b/Tests/Tester.Winform/TestForm.cs
index 427cb8b..dad7dbb 100644
--- a/Tests/Tester.Winform/TestForm.cs
+++ b/Tests/Tester.Winform/TestForm.cs
@@ -245,7 +245,7 @@ namespace Tester.Winform
// use this for internal msg loop
_twain.Open();
// use this to hook into current app loop
- //_twain.Open(new WinformMessageLoopHook(this.Handle));
+ //_twain.Open(new WindowsFormsMessageLoopHook(this.Handle));
}
if (_twain.State >= 3)