// Spludlow Software
// Copyright © Samuel P. Ludlow 2020 All Rights Reserved
// Distributed under the terms of the GNU General Public License version 3
// Distributed WITHOUT ANY WARRANTY; without implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
// https://www.spludlow.co.uk/LICENCE.TXT
// The Spludlow logo is a registered trademark of Samuel P. Ludlow and may not be used without permission
// v1.14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Spludlow.MetSat
{
///
/// Wrappers for XRIT2PIC and xRITDecompress
/// Using Spludlow.SpawnProcess that makes running .exe a peice of cake
///
public class Xrit2Pic
{
private const string _Xrit2picProgramPath = @"C:\Program Files (x86)\xrit\xrit2pic.exe";
private const string _XRITDecompressPath = @"C:\Program Files\xRITDecompress\xRITDecompress.exe";
///
/// Combines AVHRR files into a single .rah file (Rob Alblas HRPT Format) for opening in HRPT Reader
///
public static string[] RahAVHRR(string[] sourceFiles, string targetDirectory)
{
return Run(sourceFiles, targetDirectory, "-rah -nolin");
}
///
/// Run XRIT2PIC
///
public static string[] Run(string[] sourceFiles, string targetDirectory, string commandLine)
{
int processTimeoutMinutes = 10;
List targetFilenames = new List();
using (Spludlow.TempDirectory tempDir = new TempDirectory())
{
string inputDirectory = tempDir + @"\input";
string outputDirectory = tempDir + @"\output";
Directory.CreateDirectory(inputDirectory);
Directory.CreateDirectory(outputDirectory);
foreach (string sourceFile in sourceFiles)
File.Copy(sourceFile, inputDirectory + @"\" + Path.GetFileName(sourceFile));
StringBuilder arguments = new StringBuilder();
arguments.Append("-nogui -src \"@SRC\" -dest \"@DEST\" " + commandLine);
arguments.Replace("@SRC", inputDirectory);
arguments.Replace("@DEST", outputDirectory);
Spludlow.SpawnProcess.ProcessExitInfo exitInfo = Spludlow.SpawnProcess.Run(_Xrit2picProgramPath, arguments.ToString(), processTimeoutMinutes * 60);
if (exitInfo.ExitCode != 0 || exitInfo.StandardError.Length > 0)
{
Spludlow.Log.Error("xrit2pic; Process. ExitCode:" + exitInfo.ExitCode + ", Error Length:" + exitInfo.StandardError.Length, new object[] { exitInfo.StandardError, exitInfo.StandardOutput } );
throw new ApplicationException("xrit2pic; Error from Process. ExitCode:" + exitInfo.ExitCode);
}
string[] resultFiles = Directory.GetFiles(outputDirectory);
if (resultFiles.Length == 0)
throw new ApplicationException("xrit2pic no output files.");
foreach (string resultFile in resultFiles)
{
string filename = targetDirectory + @"\" + Path.GetFileName(resultFile);
if (File.Exists(filename) == true)
{
Spludlow.Log.Warning("xrit2pic target filename already exists, deleting:\t" + filename);
File.Delete(filename);
}
File.Copy(resultFile, filename);
targetFilenames.Add(filename);
}
}
return targetFilenames.ToArray();
}
public static void XRITDecompress(string inputDirectory, string outputDirectory)
{
XRITDecompress(Directory.GetFiles(inputDirectory), outputDirectory);
}
public static void XRITDecompress(string[] filenames, string outputDirectory)
{
foreach (string filename in filenames)
XRITDecompress(filename, outputDirectory, false);
}
///
/// Run XRITDecompress
///
public static string XRITDecompress(string filename, string outputDirectory, bool returnSingleFilename)
{
string arguments = Spludlow.Io.Paths.CygwinName(filename);
// This cygwin exe just won't work without a console window, so the windows will pop up when running from the desktop which is anoying
Spludlow.SpawnProcess.ProcessExitInfo exitInfo = Spludlow.SpawnProcess.Run(_XRITDecompressPath, arguments, outputDirectory, null, 60, true);
if (exitInfo.ExitCode != 0 || exitInfo.StandardError.Length > 0)
{
if (exitInfo.StandardError.Length > 0)
Spludlow.Log.Error("xRITDecompress StandardError, ExitCode:" + exitInfo.ExitCode + ", " + filename, exitInfo.StandardError);
throw new ApplicationException("xRITDecompress Error; ExitCode:" + exitInfo.ExitCode + ", StandardError.Length:" + exitInfo.StandardError.Length);
}
if (returnSingleFilename == false)
return null;
string[] resultFiles = Directory.GetFiles(outputDirectory);
if (resultFiles.Length != 1)
throw new ApplicationException("xRITDecompress Not 1 result file:\t" + resultFiles.Length + ", " + filename);
return resultFiles[0];
}
}
}