Repository navigation
Expand file tree
/
Copy pathImageInput.cs
More file actions
100 lines (92 loc) · 5.23 KB
/
Copy pathImageInput.cs
File metadata and controls
100 lines (92 loc) · 5.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.IO;
namespace TCPTunnel
{
internal enum ImageInputKind
{
NotImage,
SupportedImage,
WebPImage,
AnimatedGif
}
internal static class ImageInput
{
public static ImageInputKind Classify(string input, out string path)
{
return Classify(input, File.Exists, out path);
}
internal static ImageInputKind Classify(string input, Func<string, bool> fileExists, out string path)
{
path = null;
if (String.IsNullOrWhiteSpace(input) || fileExists == null)
return ImageInputKind.NotImage;
string candidate = input.Trim();
if (candidate.StartsWith("/", StringComparison.Ordinal))
return ImageInputKind.NotImage;
if (candidate.StartsWith("& ", StringComparison.Ordinal))
candidate = candidate.Substring(2).TrimStart();
if (candidate.Length >= 2 && candidate[0] == '"' && candidate[candidate.Length - 1] == '"')
candidate = candidate.Substring(1, candidate.Length - 2);
else if (candidate.Length >= 2 && candidate[0] == '\'' && candidate[candidate.Length - 1] == '\'')
candidate = candidate.Substring(1, candidate.Length - 2).Replace("''", "'");
else if (candidate.IndexOf('"') >= 0)
return ImageInputKind.NotImage;
Uri fileUri;
if (candidate.StartsWith("file:", StringComparison.OrdinalIgnoreCase))
{
if (!Uri.TryCreate(candidate, UriKind.Absolute, out fileUri) || !fileUri.IsFile)
return ImageInputKind.NotImage;
candidate = fileUri.LocalPath;
}
if (candidate.Length == 0 || !fileExists(candidate))
return ImageInputKind.NotImage;
string extension = Path.GetExtension(candidate);
ImageInputKind kind;
if (extension.Equals(".jpg", StringComparison.OrdinalIgnoreCase) ||
extension.Equals(".jpeg", StringComparison.OrdinalIgnoreCase) ||
extension.Equals(".png", StringComparison.OrdinalIgnoreCase))
kind = ImageInputKind.SupportedImage;
else if (extension.Equals(".webp", StringComparison.OrdinalIgnoreCase))
kind = ImageInputKind.WebPImage;
else if (extension.Equals(".gif", StringComparison.OrdinalIgnoreCase))
kind = ImageInputKind.AnimatedGif;
else
return ImageInputKind.NotImage;
try { path = Path.GetFullPath(candidate); }
catch (Exception ex) when (ex is ArgumentException || ex is NotSupportedException || ex is PathTooLongException)
{
return ImageInputKind.NotImage;
}
return kind;
}
internal static bool RunSelfTest()
{
Func<string, bool> exists = value =>
value.Equals(@"C:\x\a.jpg", StringComparison.OrdinalIgnoreCase) ||
value.Equals(@"C:\x\a.jpeg", StringComparison.OrdinalIgnoreCase) ||
value.Equals(@"C:\x\a.png", StringComparison.OrdinalIgnoreCase) ||
value.Equals(@"C:\my images\a.png", StringComparison.OrdinalIgnoreCase) ||
value.Equals(@"C:\x\someone's.png", StringComparison.OrdinalIgnoreCase) ||
value.Equals(@"C:\x\a.webp", StringComparison.OrdinalIgnoreCase) ||
value.Equals(@"C:\x\a.gif", StringComparison.OrdinalIgnoreCase);
string path;
return Classify(@"C:\x\a.JPG", exists, out path) == ImageInputKind.SupportedImage &&
Classify(@"C:\x\a.JPEG", exists, out path) == ImageInputKind.SupportedImage &&
Classify(@"C:\x\a.PNG", exists, out path) == ImageInputKind.SupportedImage &&
Classify("\"C:\\my images\\a.png\"", exists, out path) == ImageInputKind.SupportedImage &&
Classify(@"C:\x\a.webp", exists, out path) == ImageInputKind.WebPImage &&
Classify(@"C:\x\a.gif", exists, out path) == ImageInputKind.AnimatedGif &&
Classify("'C:\\x\\a.gif'", exists, out path) == ImageInputKind.AnimatedGif &&
Classify("& \"C:\\x\\a.gif\"", exists, out path) == ImageInputKind.AnimatedGif &&
Classify("file:///C:/x/a.gif", exists, out path) == ImageInputKind.AnimatedGif &&
Classify(@"C:\x\someone's.png", exists, out path) == ImageInputKind.SupportedImage &&
Classify("\"C:\\x\\someone's.png\"", exists, out path) == ImageInputKind.SupportedImage &&
Classify("& 'C:\\x\\someone''s.png'", exists, out path) == ImageInputKind.SupportedImage &&
Classify("file:///C:/x/someone%27s.png", exists, out path) == ImageInputKind.SupportedImage &&
Classify(@"C:\missing.png", exists, out path) == ImageInputKind.NotImage &&
Classify(@"/ping C:\x\a.jpg", exists, out path) == ImageInputKind.NotImage &&
Classify(@"look C:\x\a.jpg", exists, out path) == ImageInputKind.NotImage &&
Classify("\"C:\\x\\a.jpg\" \"C:\\x\\b.jpg\"", exists, out path) == ImageInputKind.NotImage;
}
}
}