summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2014-05-07 22:13:18 -0700
committerMichael Vrhel <michael.vrhel@artifex.com>2014-09-09 16:39:35 -0700
commite49f2b58d98071192cc803951da5e06783d55592 (patch)
tree4ab25129b4cd97269dc1a72c934d4168e86f40b3 /platform
parent6b99e7b1295d094323c10401f8b21c81c29554eb (diff)
downloadmupdf-e49f2b58d98071192cc803951da5e06783d55592.tar.xz
Add error checking to catch when gs DLL is not found.
Diffstat (limited to 'platform')
-rw-r--r--platform/winrt/gsview/About.xaml39
-rw-r--r--platform/winrt/gsview/About.xaml.cs16
-rw-r--r--platform/winrt/gsview/MainWindow.xaml.cs17
-rw-r--r--platform/winrt/gsview/ghostsharp.cs279
-rw-r--r--platform/winrt/gsview/gsview.csproj5
5 files changed, 307 insertions, 49 deletions
diff --git a/platform/winrt/gsview/About.xaml b/platform/winrt/gsview/About.xaml
index d6776c44..13b3b142 100644
--- a/platform/winrt/gsview/About.xaml
+++ b/platform/winrt/gsview/About.xaml
@@ -1,9 +1,10 @@
-<Window x:Class="gsview.About"
+<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="{Binding RelativeSource={RelativeSource Self}, Mode=OneTime, Path=ProductTitle}"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="gsview.About"
+ Title="{Binding ProductTitle, Mode=OneTime, RelativeSource={RelativeSource Self}}"
x:Uid="idAboutBox"
- Style="{DynamicResource AboutDialogStyle}" WindowStartupLocation="CenterOwner">
+ Style="{DynamicResource AboutDialogStyle}" WindowStartupLocation="CenterOwner" Height="353" Width="501">
<Window.Resources>
<XmlDataProvider x:Key="aboutProvider" XPath="ApplicationInfo" IsAsynchronous="False" IsInitialLoadEnabled="True">
<x:XData>
@@ -13,7 +14,7 @@
</x:XData>
</XmlDataProvider>
<Image x:Key="aboutLogo" Source="resources/banner.png" />
- <Style x:Key="AboutDialogStyle" TargetType="Window">
+ <Style x:Key="AboutDialogStyle" TargetType="{x:Type Window}">
<Setter Property="Height" Value="Auto" />
<Setter Property="Width" Value="500" />
<Setter Property="ShowInTaskbar" Value="False" />
@@ -36,7 +37,7 @@
</Setter.Value>
</Setter>
</Style>
- <Style TargetType="Label">
+ <Style TargetType="{x:Type Label}">
<Setter Property="Padding" Value="0" />
</Style>
<Style x:Key="ParagraphSeparator" TargetType="{x:Type Label}">
@@ -44,7 +45,7 @@
</Style>
<Style x:Key="LinkLabelStyle">
<Setter Property="Control.Padding" Value="0" />
- <Setter Property="Control.VerticalAlignment" Value="Center" />
+ <Setter Property="FrameworkElement.VerticalAlignment" Value="Center" />
</Style>
<Style x:Key="ReadOnlyDescStyle" TargetType="{x:Type TextBox}">
<Setter Property="MinLines" Value="6" />
@@ -64,27 +65,29 @@
<StackPanel x:Uid="clientArea" Style="{StaticResource BackgroundStyle}">
<StaticResource ResourceKey="aboutLogo" />
<StackPanel x:Uid="displayArea" Style="{StaticResource DisplayAreaStyle}"
- DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Mode=OneTime}">
+ DataContext="{Binding Mode=OneTime, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
<Label x:Name="productName" x:Uid="productName"
- Content="{Binding Mode=OneTime, Path=Product}" />
+ Content="{Binding Product, Mode=OneTime}" />
<StackPanel x:Uid="versionArea" Orientation="Horizontal">
<Label x:Name="versionLabel" x:Uid="VersionLabel" Content="Version - " />
- <Label x:Name="version" x:Uid="version" Content="{Binding Mode=OneTime, Path=Version}" />
+ <Label x:Name="version" x:Uid="version" Content="{Binding Version, Mode=OneTime}" />
</StackPanel>
- <Label x:Name="copyright" x:Uid="copyright" Content="{Binding Mode=OneTime, Path=Copyright}" />
- <Label x:Name="company" x:Uid="company" Content="{Binding Mode=OneTime, Path=Company}" />
+ <Label x:Name="copyright" x:Uid="copyright" Content="{Binding Copyright, Mode=OneTime}" />
+ <Label x:Name="company" x:Uid="company" Content="{Binding Company, Mode=OneTime}" />
<Label x:Name="reserved" x:Uid="reserved" Content="All Rights Reserved." />
<Label x:Name="info" x:Uid="info" Style="{StaticResource ParagraphSeparator}"
- Content="Product details:" />
- <TextBox x:Name="description" x:Uid="description" Text="{Binding Mode=OneTime, Path=Description}"
- Style="{StaticResource ReadOnlyDescStyle}" />
+ Content="Product details:" />
+ <TextBox x:Name="description" x:Uid="description" Text=""
+ Style="{StaticResource ReadOnlyDescStyle}" Height="140" />
<DockPanel x:Uid="buttonArea">
<Button x:Name="okButton" x:Uid="okButton" Style="{StaticResource OkButtonStyle}"
- Content="OK" />
+ Content="OK" />
<Label x:Name="productLink" x:Uid="productLink" Style="{StaticResource LinkLabelStyle}" >
- <Hyperlink x:Name="hyperlink" x:Uid="hyperlink" NavigateUri="{Binding Mode=OneTime, Path=LinkUri}" Style="{StaticResource LinkLabelStyle}"
- Hyperlink.RequestNavigate="hyperlink_RequestNavigate">
- <TextBlock Text="{Binding Mode=OneTime, Path=LinkText}" />
+ <Hyperlink x:Name="hyperlink" x:Uid="hyperlink" NavigateUri="{Binding LinkUri, Mode=OneTime}" Style="{StaticResource LinkLabelStyle}"
+ RequestNavigate="hyperlink_RequestNavigate">
+ <InlineUIContainer>
+ <TextBlock Text="{Binding LinkText, Mode=OneTime}" />
+ </InlineUIContainer>
</Hyperlink>
</Label>
</DockPanel>
diff --git a/platform/winrt/gsview/About.xaml.cs b/platform/winrt/gsview/About.xaml.cs
index 81f888d4..6bd50cbe 100644
--- a/platform/winrt/gsview/About.xaml.cs
+++ b/platform/winrt/gsview/About.xaml.cs
@@ -5,6 +5,7 @@ using System.Reflection;
using System.Windows;
using System.Windows.Data;
using System.Xml;
+using System.ComponentModel;
namespace gsview
{
@@ -19,13 +20,8 @@ namespace gsview
protected About()
{
InitializeComponent();
- InitDescription();
}
- private void InitDescription()
- {
- VariableDescription = CalculatePropertyValue<AssemblyDescriptionAttribute>(propertyNameDescription, xPathDescription);
- }
/// <summary>
/// Constructor that takes a parent for this About dialog.
@@ -54,8 +50,8 @@ namespace gsview
#region AboutData Provider
#region Member data
- public String VariableDescription;
private XmlDocument xmlDoc = null;
+ private string variabledescription;
private const string propertyNameTitle = "Title";
private const string propertyNameDescription = "Description";
private const string propertyNameProduct = "Product";
@@ -118,7 +114,13 @@ namespace gsview
/// </summary>
public string Description
{
- get { return VariableDescription; }
+ get { return CalculatePropertyValue<AssemblyDescriptionAttribute>(propertyNameDescription, xPathDescription);}
+ }
+
+ public string VariableDescription
+ {
+ get;
+ set;
}
/// <summary>
diff --git a/platform/winrt/gsview/MainWindow.xaml.cs b/platform/winrt/gsview/MainWindow.xaml.cs
index 86bdc575..0700a014 100644
--- a/platform/winrt/gsview/MainWindow.xaml.cs
+++ b/platform/winrt/gsview/MainWindow.xaml.cs
@@ -258,6 +258,7 @@ namespace gsview
m_outputintents = new OutputIntent();
m_outputintents.Activate();
m_ghostscript.gsIOUpdateMain += new ghostsharp.gsIOCallBackMain(gsIO);
+ m_ghostscript.gsDLLProblemMain += new ghostsharp.gsDLLProblem(gsDLL);
m_convertwin = null;
m_extractwin = null;
m_selection = null;
@@ -1198,6 +1199,11 @@ namespace gsview
}
}
+ private void gsDLL(object gsObject, String mess)
+ {
+ ShowMessage(NotifyType_t.MESS_STATUS, mess);
+ }
+
private void gsIO(object gsObject, String mess, int len)
{
m_gsoutput.Update(mess, len);
@@ -3934,12 +3940,17 @@ namespace gsview
{
String muversion;
About about = new About(this);
- var desc = about.VariableDescription;
+ var desc_static = about.Description;
+ String desc;
+
/* Get our gs and mupdf version numbers to add to the description */
mu_doc.GetVersion(out muversion);
String gs_vers = m_ghostscript.GetVersion();
- desc = desc + "\nBuilt with MuPDF Version " + muversion + "\nGhostscript DLL: " + gs_vers;
- about.VariableDescription = desc;
+ if (gs_vers == null)
+ desc = desc_static + "\nBuilt with MuPDF Version " + muversion + "\nGhostscript DLL: Not Found";
+ else
+ desc = desc_static + "\nBuilt with MuPDF Version " + muversion + "\nGhostscript DLL: " + gs_vers;
+ about.description.Text = desc;
about.ShowDialog();
}
diff --git a/platform/winrt/gsview/ghostsharp.cs b/platform/winrt/gsview/ghostsharp.cs
index e4610d79..4b0cf311 100644
--- a/platform/winrt/gsview/ghostsharp.cs
+++ b/platform/winrt/gsview/ghostsharp.cs
@@ -210,6 +210,251 @@ namespace gsview
public static extern void gsapi_run_string_end(IntPtr instance,
int usererr, ref int exitcode);
+
+ /* In case the DLL is not found we need to wrap the methods up with
+ * a try/catch */
+ private int tc_gsapi_revision(ref gsapi_revision_t vers, int size)
+ {
+ int code = 0;
+ try
+ {
+ code = gsapi_revision(ref vers, size);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+
+ private int tc_gsapi_new_instance(out IntPtr pinstance, IntPtr caller_handle)
+ {
+ int code = 0;
+ pinstance = IntPtr.Zero;
+ try
+ {
+ code = gsapi_new_instance(out pinstance, caller_handle);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+
+ private int tc_gsapi_delete_instance(IntPtr instance)
+ {
+ try
+ {
+ gsapi_delete_instance(instance);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return 0;
+ }
+
+ private int tc_gsapi_init_with_args(IntPtr instance, int argc, IntPtr argv)
+ {
+ int code;
+ try
+ {
+ code = gsapi_init_with_args(instance, argc, argv);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+
+ private int tc_gsapi_exit(IntPtr instance)
+ {
+ int code;
+ try
+ {
+ code = gsapi_exit(instance);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+
+ private int tc_gsapi_set_arg_encoding(IntPtr instance, int encoding)
+ {
+ int code;
+ try
+ {
+ code = gsapi_set_arg_encoding(instance, encoding);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+
+ private int tc_gsapi_set_stdio(IntPtr instance, gsStdIOHandler stdin,
+ gsStdIOHandler stdout, gsStdIOHandler stderr)
+ {
+ int code;
+ try
+ {
+ code = gsapi_set_stdio(instance, stdin, stdout, stderr);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+
+ private int tc_gsapi_run_string_begin(IntPtr instance, int usererr,
+ ref int exitcode)
+ {
+ try
+ {
+ gsapi_run_string_begin(instance, usererr, ref exitcode);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return 0;
+ }
+
+ private int tc_gsapi_run_string_continue(IntPtr instance, IntPtr command,
+ int count, int usererr, ref int exitcode)
+ {
+ try
+ {
+ gsapi_run_string_continue(instance, command, count, usererr,
+ ref exitcode);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return 0;
+ }
+
+ private int tc_gsapi_run_string_end(IntPtr instance, int usererr,
+ ref int exitcode)
+ {
+ try
+ {
+ gsapi_run_string_end(instance, usererr, ref exitcode);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: Ghostscript DLL not found";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect Ghostscript DLL";
+ gsDLLProblemMain(this, output);
+ return -1;
+ }
+ return 0;
+ }
+
private int StdInCallback(IntPtr handle, IntPtr pointer, int count)
{
String output = Marshal.PtrToStringAnsi(pointer);
@@ -277,6 +522,8 @@ namespace gsview
BackgroundWorker m_worker;
gsParams_t m_params;
/* Callbacks to Main */
+ internal delegate void gsDLLProblem(object gsObject, String mess);
+ internal event gsDLLProblem gsDLLProblemMain;
internal delegate void gsIOCallBackMain(object gsObject, String mess, int len);
internal event gsIOCallBackMain gsIOUpdateMain;
internal delegate void gsCallBackMain(object gsObject, gsEventArgs info);
@@ -337,7 +584,7 @@ namespace gsview
GCHandle argPtrsStable;
/* New instance */
- int code = gsapi_new_instance(out gsInstance, IntPtr.Zero);
+ int code = tc_gsapi_new_instance(out gsInstance, IntPtr.Zero);
if (code < 0)
{
gsparams.result = GS_Result_t.gsFAILED;
@@ -354,9 +601,9 @@ namespace gsview
var stdErrPtr = Marshal.GetFunctionPointerForDelegate(RaiseStdErrCallback);
// Setup stdio callback functions
- code = gsapi_set_stdio(gsInstance, RaiseStdInCallback, RaiseStdOutCallback, RaiseStdErrCallback);
+ code = tc_gsapi_set_stdio(gsInstance, RaiseStdInCallback, RaiseStdOutCallback, RaiseStdErrCallback);
- code = gsapi_set_arg_encoding(gsInstance, (int) gsEncoding.GS_ARG_ENCODING_UTF8);
+ code = tc_gsapi_set_arg_encoding(gsInstance, (int)gsEncoding.GS_ARG_ENCODING_UTF8);
if (code == 0)
{
@@ -446,7 +693,7 @@ namespace gsview
/* Also stick the array of pointers into memory that will not be GCd */
argPtrsStable = GCHandle.Alloc(argPtrs, GCHandleType.Pinned);
- code = gsapi_init_with_args(gsInstance, num_params, argPtrsStable.AddrOfPinnedObject());
+ code = tc_gsapi_init_with_args(gsInstance, num_params, argPtrsStable.AddrOfPinnedObject());
/* All the pinned items need to be freed so the GC can do its job */
for (int k = 0; k < num_params; k++)
@@ -462,7 +709,7 @@ namespace gsview
}
}
- int code1 = gsapi_exit(gsInstance);
+ int code1 = tc_gsapi_exit(gsInstance);
if ((code == 0) || (code == gsConstants.E_QUIT))
code = code1;
@@ -470,7 +717,7 @@ namespace gsview
RaiseStdOutCallback = null;
RaiseStdErrCallback = null;
- gsapi_delete_instance(gsInstance);
+ tc_gsapi_delete_instance(gsInstance);
if ((code == 0) || (code == gsConstants.E_QUIT))
{
gsparams.result = GS_Result_t.gsOK;
@@ -508,7 +755,7 @@ namespace gsview
var fs = new FileStream(in_file, FileMode.Open);
var len = (int) fs.Length;
/* New instance */
- int code = gsapi_new_instance(out gsInstance, IntPtr.Zero);
+ int code = tc_gsapi_new_instance(out gsInstance, IntPtr.Zero);
if (code < 0)
{
Params.result = GS_Result_t.gsFAILED;
@@ -525,9 +772,9 @@ namespace gsview
var stdErrPtr = Marshal.GetFunctionPointerForDelegate(RaiseStdErrCallback);
// Setup stdio callback functions
- code = gsapi_set_stdio(gsInstance, RaiseStdInCallback, RaiseStdOutCallback, RaiseStdErrCallback);
+ code = tc_gsapi_set_stdio(gsInstance, RaiseStdInCallback, RaiseStdOutCallback, RaiseStdErrCallback);
- code = gsapi_set_arg_encoding(gsInstance, (int)gsEncoding.GS_ARG_ENCODING_UTF8);
+ code = tc_gsapi_set_arg_encoding(gsInstance, (int)gsEncoding.GS_ARG_ENCODING_UTF8);
if (code == 0)
{
@@ -567,7 +814,7 @@ namespace gsview
/* Also stick the array of pointers into memory that will not be GCd */
argPtrsStable = GCHandle.Alloc(argPtrs, GCHandleType.Pinned);
- code = gsapi_init_with_args(gsInstance, num_params, argPtrsStable.AddrOfPinnedObject());
+ code = tc_gsapi_init_with_args(gsInstance, num_params, argPtrsStable.AddrOfPinnedObject());
/* First pin the data buffer */
Feed = GCHandle.Alloc(Buffer, GCHandleType.Pinned);
@@ -581,10 +828,10 @@ namespace gsview
double perc;
int total = 0;
- gsapi_run_string_begin(gsInstance, 0, ref exitcode);
+ tc_gsapi_run_string_begin(gsInstance, 0, ref exitcode);
while ((count = fs.Read(Buffer, 0, gsConstants.GS_READ_BUFFER)) > 0)
{
- gsapi_run_string_continue(gsInstance, FeedPtr, count, 0, ref exitcode);
+ tc_gsapi_run_string_continue(gsInstance, FeedPtr, count, 0, ref exitcode);
if (exitcode < 0)
{
code = exitcode;
@@ -599,7 +846,7 @@ namespace gsview
break;
}
}
- gsapi_run_string_end(gsInstance, 0, ref exitcode);
+ tc_gsapi_run_string_end(gsInstance, 0, ref exitcode);
if (code == 0)
code = exitcode;
}
@@ -613,11 +860,11 @@ namespace gsview
Feed.Free();
}
- int code1 = gsapi_exit(gsInstance);
+ int code1 = tc_gsapi_exit(gsInstance);
if ((code == 0) || (code == gsConstants.E_QUIT))
code = code1;
- gsapi_delete_instance(gsInstance);
+ tc_gsapi_delete_instance(gsInstance);
if ((code == 0) || (code == gsConstants.E_QUIT))
{
Params.result = GS_Result_t.gsOK;
@@ -747,7 +994,7 @@ namespace gsview
vers.revisiondate = 0;
int size = System.Runtime.InteropServices.Marshal.SizeOf(vers);
- if (gsapi_revision(ref vers, size) == 0)
+ if (tc_gsapi_revision(ref vers, size) == 0)
{
String product = Marshal.PtrToStringAnsi(vers.product);
String output;
diff --git a/platform/winrt/gsview/gsview.csproj b/platform/winrt/gsview/gsview.csproj
index 51970af2..04718d5f 100644
--- a/platform/winrt/gsview/gsview.csproj
+++ b/platform/winrt/gsview/gsview.csproj
@@ -264,11 +264,6 @@
<WCFMetadata Include="Service References\" />
</ItemGroup>
<ItemGroup>
- <Resource Include="AboutLogo.png">
- <SubType>Image</SubType>
- </Resource>
- </ItemGroup>
- <ItemGroup>
<Resource Include="Resources\banner.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />