From 2a7a82094d50b75380b9858eae5eb41ed169378d Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 19 Mar 2009 22:52:58 +0100 Subject: Initial import of gfax 0.7.7 --- src/fax.cs | 501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 501 insertions(+) create mode 100755 src/fax.cs (limited to 'src/fax.cs') diff --git a/src/fax.cs b/src/fax.cs new file mode 100755 index 0000000..91d0f0f --- /dev/null +++ b/src/fax.cs @@ -0,0 +1,501 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Library General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +//#define DEBUGHYLAFAX + + +namespace gfax { + using Mono.Unix; + using System; + using System.Collections; + + public enum FaxStatus: int { + Sent, + Fail, + New, + Busy, + Block, + Sleep, + Run, + Receiving, + Received + }; + + public class Fax + { + static Hylafax hfax; + static Efax efax; + static bool firstRun = true; + + public class FaxQueue + { + public string Jobid; + public string Number; + public string Status; + public FaxStatus StatusType; + public string Owner; + public string Pages; + public string Dials; + public string Error; + public object Sendat; + } + + public class FaxRecQueue + { + public string Pages; + public string Status; + public FaxStatus StatusType; + public string Sender; + public object TimeReceived; + public string Filename; + } + + public static string async_get_server_status () + { + + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + + if ( !hfax.connect() ) + return (Catalog.GetString("No Connection")); + hfax.asyncstatus("status"); + hfax.close(); + hfax = null; + return (""); + } + + if (Settings.TransmitAgent == "efax") { + //TODO put modem ready status here + if (firstRun) { + firstRun = false; + return (Catalog.GetString("Efax transmit process running...\nScanning job files every 30 seconds.")); + } + else + return (null); + } + + return (Catalog.GetString("Error transport agent not specified!")); + } + + public static ArrayList async_get_queue_status (string queue) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + + if ( hfax.connect() ) + hfax.asyncstatus(queue); + hfax.close(); + hfax = null; + } + + if (Settings.TransmitAgent == "efax") { + string reply = gfax.efax.status(queue); + + if (queue == "doneq" || queue == "sendq") + return (parse_senddone(reply)); + else // (queue == "recvq") + return (parse_receive(reply)); + } + return (null); + } + + // parse the send or done queue + public static ArrayList parse_senddone (string reply) + { + ArrayList list = new ArrayList(); + + if (reply.Length > 0) { + foreach (string s in reply.Split('\n')) { + FaxQueue hq = new FaxQueue(); + //Console.WriteLine("s length equals --> {0}", s.Length); + if (s.Length == 0 ) + break; + + string[] sa = s.Split('='); + + // TODO put error here about bad network comms + if (sa.Length != 8) { + break; + } + + if ( sa[0].Length != 0 ) + hq.Jobid = sa[0].Trim(); + else + hq.Jobid = ""; + if ( sa[1].Length != 0 ) + hq.Number = sa[1].Trim(); + else + hq.Number = ""; + if ( sa[2].Length != 0 ) { + switch (sa[2]) { + case "R": + hq.Status = Catalog.GetString("Run"); + hq.StatusType = FaxStatus.Run; + break; + case "S": + hq.Status = Catalog.GetString("Sleep"); + hq.StatusType = FaxStatus.Sleep; + break; + case "B": + hq.Status = Catalog.GetString("Block"); + hq.StatusType = FaxStatus.Block; + break; + case "W": + hq.Status = Catalog.GetString("Busy"); + hq.StatusType = FaxStatus.Busy; + break; + case "D": + hq.Status = Catalog.GetString("Done"); + hq.StatusType = FaxStatus.Sent; + break; + case "F": + hq.Status = Catalog.GetString("Fail"); + hq.StatusType = FaxStatus.Fail; + break; + case "P": + hq.Status = Catalog.GetString("New"); + hq.StatusType = FaxStatus.New; + break; + } + } + else + hq.Status = ""; + if ( sa[3].Length != 0 ) + hq.Owner = sa[3].Trim(); + else + hq.Owner = ""; + if ( sa[4].Length != 0 ) + hq.Pages = sa[4].Trim(); + else + hq.Pages = ""; + if ( sa[5].Length != 0 ) + hq.Dials = sa[5].Trim(); + else + hq.Dials = ""; + if ( sa[6].Length != 0 ) + hq.Error = sa[6]; + else + hq.Error = ""; + + if ( sa[7].Length != 0 ) { // 2004/03/09 18.01.51 + try { + hq.Sendat = (DateTime)System.DateTime.ParseExact(sa[7].Replace(".", ":").Trim(), "yyyy/MM/dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); + } + catch(FormatException e) + { + hq.Sendat = null; + } + } else { + hq.Sendat = null; + } + + list.Add(hq); + } + + } else { // no status + + FaxQueue hq = new FaxQueue(); + hq.Jobid = ""; + hq.Number = ""; + hq.Status = ""; + hq.Owner = ""; + hq.Pages = ""; + hq.Dials = ""; + hq.Error = ""; + hq.Sendat = null; + + list.Add(hq); + } + + return (list); + } + + // parse the receive queue + // + //Page S Sender/TSI Recvd@ Filename + //1 +49 30 7865224 10Nov04 fax00004.tif + // should come back as + //1= =+49 30 7865224=10Nov04=fax00004.tif + public static ArrayList parse_receive (string reply) + { + ArrayList list = new ArrayList(); + + + if (reply.Length > 0) { + foreach (string s in reply.Split('\n')) { + FaxRecQueue hq = new FaxRecQueue(); + if (s.Length == 0 ) + break; + + string[] sa = s.Split('='); + if (sa.Length != 5) { + break; + } + + if ( sa[0].Length != 0 ) + hq.Pages = sa[0].Trim(); + else + hq.Pages = ""; + if ( sa[1].Length != 0 ) + switch (sa[1]) { + case "N*": + hq.Status = Catalog.GetString("Receiving"); + hq.StatusType = FaxStatus.Receiving; + break; + case "N ": + hq.Status = Catalog.GetString("Done"); + hq.StatusType = FaxStatus.Received; + break; + } + if ( sa[2].Length != 0 ) + hq.Sender = sa[2].Trim(); + else + hq.Sender = ""; + if ( sa[3].Length != 0 ) + { + try { + hq.TimeReceived = (DateTime)System.DateTime.ParseExact(sa[3], "ddMMMyy", System.Globalization.CultureInfo.InvariantCulture); + } + catch(FormatException e ) + { + hq.TimeReceived = null; + } + } + else + hq.TimeReceived = null; + if ( sa[4].Length != 0 ) + hq.Filename = sa[4].Trim(); + else + hq.Filename = ""; + + list.Add(hq); + } + + } else { // no status + + FaxRecQueue hq = new FaxRecQueue(); + hq.Pages = ""; + hq.Status = ""; + hq.Sender = ""; + hq.TimeReceived = null; + hq.Filename = ""; + + list.Add(hq); + } + + return (list); + } + + + + public static void sendfax (string fname) + { + string remote_fname; + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Fax.sendfax] File name is : {0}", fname); + } + + if (Settings.TransmitAgent == "hylafax") { + Hylafax hfaxsf = new Hylafax(); + // hylafax actually stores the file to the server + hfaxsf.connect(); + remote_fname = hfaxsf.send_init(fname); + + // if "Cancel" button pressed on progess bar + if (remote_fname == "cancelled") + return; + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] Remote file name is : {0}", remote_fname); + } + } + + //System.Threading.Thread.Sleep(2000); + + IEnumerator enu = gfax.Destinations.GetEnumerator(); + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] Destinations has a count of : {0}", gfax.Destinations.Count); + } + } + + while ( enu.MoveNext() ) { + // TODO try catch exception here + GfaxContact c = (GfaxContact)enu.Current; + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] In while loop contact is -----> {0}", c.PhoneNumber); + } + } + + hfaxsf.send(remote_fname, c); + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] In while loop bottom... "); + } + } + + //System.Threading.Thread.Sleep(1000); + // open the log and log out going fax to server + // Date Time PhoneNumber Organization ContactPerson + // log file is in ~/.etc/gfax + //if (Settings.LogEnabled) + //log_it((GfaxContact)enu.Current); + } + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] End of send contact loop..."); + } + } + + hfaxsf = null; + } + + + //Efax transport + if (Settings.TransmitAgent == "efax") { + + // Convert the file with ghostscript + string directory = gfax.efax.send_init(fname); + if (directory == "cancelled") + return; + + IEnumerator enu = gfax.Destinations.GetEnumerator(); + while ( enu.MoveNext() ) { + gfax.efax.send(directory, (GfaxContact)enu.Current); + if (Settings.LogEnabled) + log_it((GfaxContact)enu.Current); + } + } + } + + public static bool recvfax (string fname) + { + + // Hylafax support + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + // hylafax actually stores the file to the server + hfax.connect(); + return(hfax.getfile(fname)); + } + + // Efax transport + if (Settings.TransmitAgent == "efax") { + return false; + } + + return false; + } + + + public static void log_it (GfaxContact contact) + { + + } + + + public static void modify_job (string jobid, string number, string sendat, string dials) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + hfax.job_select(jobid); + hfax.job_suspend(); + hfax.job_param_set("SENDTIME", sendat); + hfax.job_param_set("EXTERNAL", number); + hfax.job_param_set("DIALSTRING", number); + hfax.job_param_set("MAXDIALS", dials); + hfax.job_submit(); + hfax = null; + } + + /* + if (Settings.TransmitAgent == "efax") { + gfax.efax.job_kill(jobid); + gfax.efax.job_delete(jobid); + } + */ + + } + + public static void resubmit_job (string jobid, string number, string sendat, string dials) + { + // will have to query the job, get the file name + // possibly retrieve the file and then re-submit the job + + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + hfax.job_select(jobid); + + /* + hfax.job_reset("P"); + hfax.job_suspend(); + hfax.job_param_set("SENDTIME", sendat); + hfax.job_param_set("EXTERNAL", number); + hfax.job_param_set("DIALSTRING", number); + hfax.job_param_set("MAXDIALS", dials); + hfax.job_submit(); + hfax = null; + */ + } + + } + + + public static void delete_job (string jobid) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + hfax.job_select(jobid); + hfax.job_kill(); + hfax.job_delete(); + hfax = null; + } + + if (Settings.TransmitAgent == "efax") { + gfax.efax.job_kill(jobid); + gfax.efax.job_delete(jobid); + } + + } + + public static int delete_file (string fname) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + int reply = hfax.deletefile(fname); + hfax = null; + return (reply); + } + + if (Settings.TransmitAgent == "efax") { + return(0); + } + return(0); + } + } +} -- cgit v1.1-32-gdbae