public ServicePrintMonitor() { Log.Info("-- Se levanta el Servicio para Monitorizar el Servicio de Impresión --"); InitializeComponent(); Log.Info("-- Nos suscribimos a los eventos de impresión --"); EventMonitorPrinting.PrintingEven(); // Descomentar para suscribirnos a los eventos de creación de ficheros de spool Log.Info("Nos suscribimos a los eventos de creación de ficheros de Spool"); WatchIO.FileEvent(LocalPrinting.PathPrintSpool()); // Definimos un Timer para lanzar una tarea de forma periodica. Tiempo = new Timer(); Tiempo.Interval = 3600000; // 1 hora //Tiempo.Interval = 10000; // 10 sg //Tiempo.Elapsed += new ElapsedEventHandler(Metodo_delegado a ejecutar); //Tiempo.Elapsed += new ElapsedEventHandler(Programa.PruebaServicio); //Tiempo.Elapsed += new ElapsedEventHandler(Programa.Inicio); // Tarea periodica: Comprobar que estamos suscritos a los eventos de impresión Log.Info("Lanzamos EventMonitorPrinting.IsAliveEvents() de forma periódica"); Tiempo.Elapsed += new ElapsedEventHandler(EventMonitorPrinting.IsAliveEvents); // Descomentar para la suscripción a los eventos de creación de ficheros de spool Tiempo.Elapsed += new ElapsedEventHandler(WatchIO.IsAliveEvents); //Fecha = DateTime.Now.ToShortDateString().Replace("/", "-"); }
/** \brief Análisis del trabajo de Impresión. * \return No devuelve nada. * \details * Se guardan en B.D las propiedades del trabajo de impresión obtenidas a través de las API de impresión, del namespace * System.Printing y del análisis de los ficheros de Spool correspondientes al trabajo de impresión. */ private void AnalizePrintJob() // string Printer, string JobId) { // Objeto para permitir una espera en caso de que el fichero de spool este abierto ElapsedTime TiempoEspera; // Fichero de spool que se tiene que analizar FileInfo MiFileInfo; // Estructura utilizada para guardar los trabajos de impresión STRUCT_PRINT_JOB PrintJob = new STRUCT_PRINT_JOB(); this.ID_JOBNAME = ""; this.N_JOB = Convert.ToInt32(this.JobId); this.ID_PRINTER = this.Printer; // La impresora ¿es un plotter? if (Util.ContieneTexto(this.Printer, "Plotter")) { PrintJob.ID_ISPLOTTER = "S"; } else { PrintJob.ID_ISPLOTTER = "N"; } bool AnalizedSpool = false; //Se recuperan los primeros detalles del trabajo de impresión PrintJob.N_JOB = this.N_JOB; PrintJob.ID_PRINTER = this.ID_PRINTER; /// - Propiedades obtenidas a través del namespace System.Printing try { // Recuperamos las propiedades LocalPrinting.DetailsPrint(PrintJob.ID_PRINTER, this.JobId, ref PrintJob); this.ID_JOBNAME = PrintJob.ID_JOBNAME; this.F_PRINTJOB = PrintJob.F_PRINTJOB; Log.Info(" -- Se extraen las propiedades utilizando System.Printing --"); // Generamos log LogPrintJob(ref PrintJob); // Guardamos en B.D SavePrintJob(ref PrintJob); } catch (Exception e) { Log.Fatal("Error extrayendo propiedades a través de System.Printing"); Log.Fatal(e); } /// - Propiedades obtenidas a través de las APIs de impresión LimpiaStrucPrintJob(ref PrintJob); PrintJob.ID_JOBNAME = ID_JOBNAME; try { // Recuperamos las propiedades ApiImpresion MiApiImpresion = new ApiImpresion(); MiApiImpresion.Analize(this.Printer, (uint)Convert.ToInt32(this.JobId), ref PrintJob); // Guardamos en B.D las propiedades obtenidas Log.Info(" -- Se extraen las propiedades utilizando las API de impresión. --"); LogPrintJob(ref PrintJob); SavePrintJob(ref PrintJob); /// Enviamos información del trabajo de impresión via email LogPrintJobMail(ref PrintJob); } catch (Exception e) { Log.Fatal("No se puede analizar el trabajo de impresión: " + this.JobId + " a través de las APIs de winspool.drv."); Log.Fatal(e); } //try /// Para el analisis de ficheros de Spool, antes de empezar, nos aseguramos de que el fichero no está bloqueado // Establecemos un tiempo de espera TiempoEspera = new ElapsedTime(); // Fichero de spool que se tiene que analizar MiFileInfo = new FileInfo(LocalPrinting.PathPrintSpool() + @"\" + this.JobId.PadLeft(5, '0') + ".SPL"); while ((!TiempoEspera.OverElapsedTime()) & WatchIO.IsFileLocked(MiFileInfo)) { // Se da tiempo a que se libere el archivo de Spool System.Threading.Thread.Sleep(10); } /// - Propiedades obtenidas a través del análisis del fichero de Spool con lenguaje EMF LimpiaStrucPrintJob(ref PrintJob); PrintJob.ID_JOBNAME = ID_JOBNAME; if (PrintJob.N_JOBSIZE > 0) { try { Log.Debug("Analizamos si es lenguaje EMF"); // Se comenta la siguiente línea al desactivar la suscripción a los eventos del sistema de archivos de la clase WatchIO EmfSpool MyEmfSpool = new EmfSpool(LocalPrinting.PathPrintSpool() + @"\" + this.JobId.PadLeft(5, '0') + ".SPL"); MyEmfSpool.Analize(ref PrintJob); AnalizedSpool = true; Log.Info("Establecemos como fuente del análisis: EMF"); PrintJob.ID_FUENTE = "EMF"; Log.Info(" -- Se extraen las propiedades utilizando analisis EMF. --"); LogPrintJob(ref PrintJob); SavePrintJob(ref PrintJob); /// Enviamos información del trabajo de impresión via email LogPrintJobMail(ref PrintJob); } catch (Exception e) { Log.Info("El trabajo de impresión: " + this.JobId + " no utiliza lenguaje EMF."); Log.Fatal(e); }//try } /// - Propiedades obtenidas a través del análisis del fichero de Spool con lenguaje JPL. LimpiaStrucPrintJob(ref PrintJob); PrintJob.ID_JOBNAME = ID_JOBNAME; if ((!AnalizedSpool) && (PrintJob.N_JOBSIZE > 0)) { try { Log.Debug("Analizamos si es lenguaje JPL"); // Se comentan las siguientes 2 líneas al desactivar la suscripción a los eventos del sistema de archivos de la clase WatchIO Log.Debug(LocalPrinting.PathPrintSpool() + @"\" + @"\" + this.JobId.PadLeft(5, '0') + ".SPL"); JPLSpool MyJPLSpool = new JPLSpool(LocalPrinting.PathPrintSpool() + @"\" + this.JobId.PadLeft(5, '0') + ".SPL"); MyJPLSpool.Analize(ref PrintJob); AnalizedSpool = true; Log.Info(" -- Se extraen las propiedades utilizando analisis JPL. --"); LogPrintJob(ref PrintJob); SavePrintJob(ref PrintJob); /// Enviamos información del trabajo de impresión via email LogPrintJobMail(ref PrintJob); } catch (Exception e) { Log.Info("No se puede analizar el trabajo de impresión: " + this.JobId + " mediante análisis JPL."); Log.Fatal(e); } //try } //if Log.Debug("Trabajo de impresión: " + this.JobId + "en impresora " + this.Printer + " analizado con éxito"); } //AnalizeSpool()