From cc1038047e965bc7b6b51472707a8fc0014201a9 Mon Sep 17 00:00:00 2001 From: WRZOOZ Date: Wed, 15 May 2024 21:24:05 +0200 Subject: [PATCH] New and updated version of old code. --- README.md | 2 + api/discoverScanners.php | 25 +++++++ api/imageDownload.php | 26 ++++++++ api/rediscover.php | 9 +++ api/scan.php | 126 ++++++++++++++++++++++++++++++++++++ assets/placeholderImage.png | Bin 0 -> 28902 bytes assets/placeholderImage.xcf | Bin 0 -> 99873 bytes include/appConfig.php | 31 +++++++++ index.php | 35 ++++++++++ interface.php | 115 ++++++++++++++++++++++++++++++++ js/appControl.js | 79 ++++++++++++++++++++++ 11 files changed, 448 insertions(+) create mode 100644 README.md create mode 100644 api/discoverScanners.php create mode 100644 api/imageDownload.php create mode 100644 api/rediscover.php create mode 100644 api/scan.php create mode 100644 assets/placeholderImage.png create mode 100644 assets/placeholderImage.xcf create mode 100644 include/appConfig.php create mode 100644 index.php create mode 100644 interface.php create mode 100644 js/appControl.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..4993383 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# saneAdmin + diff --git a/api/discoverScanners.php b/api/discoverScanners.php new file mode 100644 index 0000000..4dde45a --- /dev/null +++ b/api/discoverScanners.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/api/imageDownload.php b/api/imageDownload.php new file mode 100644 index 0000000..6bcf029 --- /dev/null +++ b/api/imageDownload.php @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/api/rediscover.php b/api/rediscover.php new file mode 100644 index 0000000..93c9bf0 --- /dev/null +++ b/api/rediscover.php @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/api/scan.php b/api/scan.php new file mode 100644 index 0000000..833596e --- /dev/null +++ b/api/scan.php @@ -0,0 +1,126 @@ + ".$appConfig['imagesLocation'].$filename; + + +//// +// +/// Scanning start +// +//// + +//Prepare directory for scanned image +if(!is_dir($appConfig['imagesLocation'])) mkdir($appConfig['imagesLocation'], 777, true); + +//Scan image +shell_exec($scanCommand); + +//Output scanned image name indicating that scanning finished +echo $filename; + +?> \ No newline at end of file diff --git a/assets/placeholderImage.png b/assets/placeholderImage.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc1947d283aca025a07648dddb063735d76d906 GIT binary patch literal 28902 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 literal 0 HcmV?d00001 diff --git a/include/appConfig.php b/include/appConfig.php new file mode 100644 index 0000000..2b46450 --- /dev/null +++ b/include/appConfig.php @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..1bd3f60 --- /dev/null +++ b/index.php @@ -0,0 +1,35 @@ + + + + + + + saneAdmin + + + + + + +
+

saneAdmin

+ +
+
+
+ +

Searching for scanners...

+
+ + + + + \ No newline at end of file diff --git a/interface.php b/interface.php new file mode 100644 index 0000000..80e596c --- /dev/null +++ b/interface.php @@ -0,0 +1,115 @@ + + + + + + + saneAdmin + + + + + + +
+

saneAdmin - web based scanner control

+
+ +
+
+
+

Settings

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ +
+
+

Scanned image preview

+ Scanned image preview +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/js/appControl.js b/js/appControl.js new file mode 100644 index 0000000..075b5b9 --- /dev/null +++ b/js/appControl.js @@ -0,0 +1,79 @@ +function discoverScanners(attemptID) +{ + var xhttp = new XMLHttpRequest(); + + xhttp.onreadystatechange = function() + { + if (this.readyState == 4 && this.status == 200) + { + if(this.responseText == "OK") + { + location.href = "interface.php"; + return true; + } + else + { + console.log("[Scanner discovery(attempt " + attemptID + ")] Failed with message: " + this.responseText); + setTimeout(discoverScanners, 2000, ++attemptID); + } + } + }; + + xhttp.open("GET", "api/discoverScanners.php", true); + xhttp.send(); + + if(attemptID > 3) + { + var progressBarElement = document.getElementById("scannerSearchProgress"); + progressBarElement.innerHTML = '
Attempt ' + attemptID + '
'; + } +} + +function scannersDiscoveryController() +{ + var progressBarElement = document.getElementById("scannerSearchProgress"); + if(progressBarElement != null) progressBarElement.innerHTML = '
'; + else return; + + discoverScanners(1); +} + +function scanImage() +{ + const scanningAnimationModal = new bootstrap.Modal(document.getElementById('scanningAnimationModal')); + + var deviceID = document.getElementById("deviceIDFormSelect").value; + var outputImageResolution = document.getElementById("outputImageResolutionFormSelect").value; + var outputImageColorDepth = document.getElementById("outputImageColorDepthFormSelect").value; + var outputFileFormat = document.getElementById("outputFileFormatFormSelect").value; + var inputPageSize = document.getElementById("inputPageSizeFormSelect").value; + + var xhttp = new XMLHttpRequest(); + + xhttp.onreadystatechange = function() + { + // TODO / DEBUG - Enable this + if (this.readyState == 4 && this.status == 200) + { + var scannedFileName = this.responseText; + + var scannedImagePreview = document.getElementById("scanPreview"); + scannedImagePreview.src = "api/imageDownload.php?filename=" + scannedFileName; + scannedImagePreview.alt = scannedFileName; + + var scannedImageDownloadButton = document.getElementById("scannedImageDownloadButton"); + scannedImageDownloadButton.href = "api/imageDownload.php?filename=" + scannedFileName; + scannedImageDownloadButton.style = "display: block;"; + + scanningAnimationModal.hide(); + } + }; + + xhttp.open("GET", "api/scan.php?outputImageResolution=" + outputImageResolution + "&outputImageColorDepth=" + outputImageColorDepth + "&outputFileFormat=" + outputFileFormat + "&inputPageSize=" + inputPageSize + "&deviceID=" + deviceID, true); + xhttp.send(); + + scanningAnimationModal.show(); +} + + +document.addEventListener("DOMContentLoaded", (event) => { scannersDiscoveryController(); });