mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-17 06:06:00 -06:00
275 lines
6.9 KiB
C++
275 lines
6.9 KiB
C++
#include <SysExec/SysExec.h>
|
|
#include <Signals/Signals.h>
|
|
|
|
#include <cups/cups.h>
|
|
|
|
#include "maxpdf_frontend.h"
|
|
|
|
#include "PdfPaths.h"
|
|
|
|
#define IMAGEFILE <maxpdf_frontend/maxpdf_frontend.iml>
|
|
#include <Draw/iml_source.h>
|
|
|
|
// parameters from command line
|
|
// 1 2 3 4 5 6 7
|
|
// job user title copies options faxfile printer
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// close handler
|
|
void TPdfFrontend::Close()
|
|
{
|
|
onCancel();
|
|
|
|
} // END TPdfFrontend::Close()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// reloads document list from data folder
|
|
void TPdfFrontend::onSIGHUP(void)
|
|
{
|
|
// clears old document lists
|
|
DocumentList.Clear();
|
|
Documents.Clear();
|
|
|
|
String DataPath = GetPdfDataPath();
|
|
FindFile ff(DataPath + "*-*");
|
|
while(ff)
|
|
{
|
|
if(ff.GetName() != "seqf")
|
|
Documents.Add(DataPath + ff.GetName());
|
|
ff.Next();
|
|
}
|
|
Sort(Documents);
|
|
for(int i = 0; i < Documents.GetCount(); i++)
|
|
{
|
|
// inside list puts just the document name, skipping
|
|
// the sequence number (4 digits)
|
|
// nnnn-s-name
|
|
DocumentList.Add(GetFileName(Documents[i]).Mid(5));
|
|
}
|
|
|
|
// brings main dialog on top
|
|
Hide();Show(); // sigh... any other way to bring window on top ???
|
|
|
|
} // END TPdfFrontendCtrl::onSIGHUP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// cancel pdf creation handler
|
|
void TPdfFrontend::onCancel(void)
|
|
{
|
|
if(DocumentList.GetCount() == 0 || PromptYesNo("Annullare la generazione ?"))
|
|
{
|
|
// remove pending poststript documents and closes app
|
|
ClearDocuments();
|
|
Break(0);
|
|
}
|
|
|
|
} // END TPdfFrontend::onCancel()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// create handler
|
|
void TPdfFrontend::onCreate(void)
|
|
{
|
|
|
|
FileSel fs;
|
|
|
|
// if no documents, just do nothing
|
|
if(!Documents.GetCount())
|
|
return;
|
|
|
|
// first, gets last browsed path (if any)
|
|
String cfgPath = GetPdfConfigPath() + "lastpath";
|
|
if(FileExists(cfgPath))
|
|
{
|
|
FileIn f(cfgPath);
|
|
fs.Set(f.GetLine());
|
|
}
|
|
|
|
// gets the output file name, returns if cancelled
|
|
fs.DefaultExt(".pdf").Type("documenti pdf", "*.pdf");
|
|
if(!fs.ExecuteSaveAs("Nome del documento pdf:"))
|
|
return;
|
|
|
|
// stores last active output path
|
|
RealizeDirectory(GetPdfConfigPath());
|
|
FileOut f(cfgPath);
|
|
f.PutLine(fs.Get());
|
|
|
|
// creates the command line and executes ghostscript
|
|
String FileName = fs.Get();
|
|
String args =
|
|
"-q -dBATCH -dAutoFilterColorImages=false -sColorImageFilter=FlateEncode -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=\"" +
|
|
FileName + "\" \"" +
|
|
Documents[0] + "\"";
|
|
for(int i = 1 ; i < Documents.GetCount(); i++)
|
|
args = args + " \"" + Documents[i] + "\"";
|
|
String OutStr, ErrStr;
|
|
bool res = SysExec("gs", args, Environment(), OutStr, ErrStr);
|
|
|
|
// creates progress bar and hooks inside client
|
|
// Progress progress("Creazione pdf in corso....");
|
|
// Client.setProgress(progress);
|
|
// progress.Create();
|
|
|
|
// Client.setProgress(0);
|
|
// if(progress.Canceled())
|
|
// res = false;
|
|
// if error, does nothing
|
|
if(!res)
|
|
return;
|
|
|
|
// clear collected documents
|
|
ClearDocuments();
|
|
|
|
// closes application
|
|
Break(0);
|
|
|
|
} // END TPdfFrontend::onCreate()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// constructor class TPdfFrontend
|
|
TPdfFrontend::TPdfFrontend()
|
|
{
|
|
// clears document list and documents
|
|
DocumentList.Clear();
|
|
Documents.Clear();
|
|
|
|
// setup button handlers
|
|
CreateButton <<= THISBACK(onCreate);
|
|
CancelButton <<= THISBACK(onCancel);
|
|
|
|
// install the SIGHUP handler
|
|
Signals().Handle(SIGHUP, THISBACK(onSIGHUP));
|
|
|
|
// restores fax documents left from previous run, if any
|
|
String DataPath = GetPdfDataPath();
|
|
FindFile ff(DataPath + "*-*");
|
|
while(ff)
|
|
{
|
|
if(ff.GetName() != "seqf")
|
|
Documents.Add(DataPath + ff.GetName());
|
|
ff.Next();
|
|
}
|
|
Sort(Documents);
|
|
for(int i = 0; i < Documents.GetCount(); i++)
|
|
{
|
|
// inside list puts just the document name, skipping
|
|
// the sequence number (4 digits)
|
|
// nnnn-s-name
|
|
DocumentList.Add(GetFileName(Documents[i]).Mid(5));
|
|
}
|
|
|
|
CtrlLayout(*this, "MaxPdf");
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// destructor class TPdfFrontend
|
|
TPdfFrontend::~TPdfFrontend()
|
|
{
|
|
|
|
} // END destructor class TPdfFrontend
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// adds a document
|
|
void TPdfFrontend::AddDocument(String const &name, String const &Title)
|
|
{
|
|
if(FileExists(name))
|
|
{
|
|
// create the dest path, if needed
|
|
RealizeDirectory(GetPdfDataPath());
|
|
|
|
// opens sequence file, if any end read sequence number
|
|
int Seq;
|
|
String SeqPath = GetPdfDataPath() + "seqf";
|
|
if(FileExists(SeqPath))
|
|
{
|
|
FileIn SeqFile(SeqPath);
|
|
Seq = atoi(SeqFile.GetLine());
|
|
}
|
|
else
|
|
Seq = 1;
|
|
|
|
// creates destination file name
|
|
String DestName = GetPdfDataPath() + FormatIntDec(Seq, 4, '0') + "-" + Title;
|
|
|
|
// copies the file to data folder
|
|
FileCopy(name, DestName);
|
|
|
|
// adds to document lists
|
|
DocumentList.Add(Title);
|
|
Documents.Add(DestName);
|
|
|
|
// stores the next sequence number
|
|
Seq++;
|
|
FileOut SeqFile(SeqPath);
|
|
SeqFile.PutLine(FormatInt(Seq));
|
|
}
|
|
|
|
} // END TPdfFrontend::AddDocument()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// removes a document from document list
|
|
bool TPdfFrontend::RemoveDocument(int index)
|
|
{
|
|
if(index < 0 || index >= DocumentList.GetCount())
|
|
return false;
|
|
FileDelete(Documents[index]);
|
|
DocumentList.Remove(index);
|
|
Documents.Remove(index);
|
|
|
|
} // END TPdfFrontend::RemoveDocument()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// clears documents list
|
|
void TPdfFrontend::ClearDocuments(void)
|
|
{
|
|
for(int i = 0; i < Documents.GetCount(); i++)
|
|
FileDelete(Documents[i]);
|
|
DocumentList.Clear();
|
|
Documents.Clear();
|
|
FileDelete(GetPdfDataPath()+"seqf");
|
|
|
|
} // END TPdfFrontend::ClearDocuments()
|
|
|
|
|
|
GUI_APP_MAIN
|
|
{
|
|
// if wrong number of parameters, print error and exit
|
|
if(CommandLine().GetCount() < 7)
|
|
{
|
|
PromptOK("USAGE : maxpdf_frontend job user title copies options faxfile printer");
|
|
SetExitCode(1);
|
|
return;
|
|
}
|
|
|
|
// sets up exit code
|
|
SetExitCode(0);
|
|
|
|
// creates FaxFrontend object
|
|
TPdfFrontend PdfFrontend;
|
|
|
|
// add the provided document and removes the temp file
|
|
PdfFrontend.AddDocument(CommandLine()[5], CommandLine()[2]);
|
|
FileDelete(CommandLine()[5]);
|
|
|
|
// @@@ WORKAROUND TO DETACH BACKEND AND FREE CUPS QUEUE
|
|
// cancels current job
|
|
cupsCancelJob(CommandLine()[6], atoi(CommandLine()[1]));
|
|
|
|
// checks whether another instance is running
|
|
if(Signals().IsOtherInstanceRunning())
|
|
{
|
|
// yep, just send it a SIGHUP signal to running app and terminate
|
|
// this tells to running app to update document list
|
|
Signals().Send(SIGHUP);
|
|
|
|
return;
|
|
}
|
|
|
|
// here we are in child app, we must store the instance
|
|
Signals().StoreInstance();
|
|
|
|
// executes main window
|
|
PdfFrontend.Run();
|
|
|
|
} // END Constructor class TPdfFrontend
|