Compilata da CSiCoAlm il 2022/09/22 - Versione in cui ho sostituito l'oggetto WebBrowser con la classe WebClient per poter gestire in parallelo i download.
357 lines
14 KiB
C#
357 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Xml;
|
|
using System.Xml.Serialization;
|
|
|
|
|
|
|
|
namespace A69WD {
|
|
|
|
/// <summary>
|
|
/// Classe per gestire le configurazioni dei plugin.
|
|
/// La classe con le configurazioni dell'applicativo, deve derivare da questa.
|
|
/// </summary>
|
|
[Serializable]
|
|
public class Cfg {
|
|
|
|
#region Costruttore statico
|
|
|
|
public static Cfg Settings {
|
|
get {
|
|
//if (settings == null) {
|
|
// settings = new Cfg();
|
|
// settings.Deserialize();
|
|
//}
|
|
//return settings;
|
|
if (val == 0) {
|
|
settings = new Cfg();
|
|
settings.Deserialize();
|
|
val++;
|
|
}
|
|
return settings;
|
|
}
|
|
}
|
|
|
|
[NonSerialized]
|
|
private static Cfg settings = null;
|
|
[NonSerialized]
|
|
private static int val = 0;
|
|
[NonSerialized]
|
|
private string SettingsFilePath = "Settings.cfg";
|
|
|
|
|
|
/// <summary>
|
|
/// Costruttore per la serializzazione
|
|
/// </summary>
|
|
public Cfg() {; }
|
|
|
|
#endregion
|
|
|
|
|
|
#region Gestione della Serializzazione
|
|
|
|
public void Serialize() {
|
|
XmlTextWriter writer = null;
|
|
try {
|
|
// Creo un flusso per l'operazione di scrittura dei dati su file
|
|
writer = new XmlTextWriter(SettingsFilePath, Encoding.UTF8);
|
|
// write a readable file
|
|
writer.Formatting = Formatting.Indented;
|
|
writer.Indentation = 4;
|
|
// Occorre un'istanza della classe XmlSerializer
|
|
XmlSerializer serializer = new XmlSerializer(typeof(Cfg));
|
|
// e questo é tutto ciò che serve per persistere i dati
|
|
serializer.Serialize(writer, Settings);
|
|
} catch (Exception ex) {
|
|
throw new ApplicationException("Serialize: " + ex.Message);
|
|
} finally {
|
|
// Chiudere sempre i flussi non appena possibile
|
|
writer.Close();
|
|
}
|
|
|
|
}
|
|
|
|
public void Deserialize() {
|
|
//if (File.Exists(SettingsFilePath)) {
|
|
XmlTextReader reader = null;
|
|
try {
|
|
// Creo un flusso per l'operazione di lettura dei dati dal file
|
|
reader = new XmlTextReader(SettingsFilePath);
|
|
// Occorre un'istanza della classe XmlSerializer
|
|
XmlSerializer serializer = new XmlSerializer(typeof(Cfg));
|
|
// Collego l'istanza XmlSerializer al gestore dell'evento
|
|
serializer.UnknownElement += new XmlElementEventHandler(serializer_UnknownElement);
|
|
// e questo é tutto ciò che serve per leggere i dati dal formato XML
|
|
settings = (Cfg)serializer.Deserialize(reader);
|
|
} catch (FileNotFoundException) {
|
|
throw new ApplicationException("File inesistente");
|
|
} finally {
|
|
reader.Close();
|
|
}
|
|
//}
|
|
}
|
|
|
|
///<summary>
|
|
///Metodo: Gestore dell'evento UnknownElement
|
|
///</summary>
|
|
private void serializer_UnknownElement(object sender, XmlElementEventArgs e) {
|
|
string msg = "Unknown Element";
|
|
msg += "\t" + e.Element.Name + " " + e.Element.InnerXml;
|
|
msg += "\t LineNumber: " + e.LineNumber;
|
|
msg += "\t LinePosition: " + e.LinePosition;
|
|
Cfg x = (Cfg)e.ObjectBeingDeserialized;
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
#region Settings:
|
|
|
|
#region Serializzati nel file di configurazione:
|
|
|
|
/// <summary>
|
|
/// Path root dell'applicazione. Da questo derivano tutti gli altri path.
|
|
/// </summary>
|
|
public virtual string PathApplicationRoot { get { return applicationRootPath; } set { applicationRootPath = value; } }
|
|
private string applicationRootPath;
|
|
|
|
/// <summary>
|
|
/// Nome del database usato dall'applicazione [DEPRECATE].
|
|
/// </summary>
|
|
public virtual string DBName { get { return dbName; } set { dbName = value; } }
|
|
private string dbName;
|
|
|
|
/// <summary>
|
|
/// Dimensione massima dei singoli file di log espressa in KB.
|
|
/// </summary>
|
|
public int LogsFileSizeLimitKB { get { return logsFileSizeLimitKB; } set { logsFileSizeLimitKB = value; } }
|
|
private int logsFileSizeLimitKB;
|
|
|
|
/// <summary>
|
|
/// Nome di riferimento per gli eventi inseriti nell'event logger di windows.
|
|
/// Se lasciato nullo o vuoto, disabilita l'inserimento dei log nell'event logger di windows.
|
|
/// </summary>
|
|
public virtual string LogsWinLoggerRef { get { return logsWinLoggerRef; } set { logsWinLoggerRef = value; } }
|
|
private string logsWinLoggerRef;
|
|
|
|
/// <summary>
|
|
/// Editor per la visualizzazione dei testi e dei logs
|
|
/// </summary>
|
|
public virtual string TextEditor { get { return textEditor; } set { textEditor = value; } }
|
|
private string textEditor;
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region Ricavati indirettamente dal file di configurazione
|
|
|
|
/// <summary>
|
|
/// Path del database usato dall'applicazione.
|
|
/// Vecchia versione:
|
|
/// public virtual string PathDB { get { return dbPath; } set { dbPath = value; } } private string dbPath;
|
|
/// </summary>
|
|
public virtual string PathDB { get { return Path.Combine(PathApplicationRoot, "DB"); } }
|
|
|
|
/// <summary>
|
|
/// Stringa di connessione al database dell'applicazione [DEPRECATE].
|
|
/// </summary>
|
|
public virtual string DBConnectionString { get { return string.Format("data source=\"{0}\"", Path.Combine(PathDB, dbName)); } }
|
|
|
|
/// <summary>
|
|
/// Path completo del file di log
|
|
/// Vecchia versione:
|
|
/// public virtual string PathFileLogs { get { return logsFilePath; } set { logsFilePath = value; } } private string logsFilePath;
|
|
/// </summary>
|
|
public virtual string PathFileLogs { get { return Path.Combine(Path.Combine(PathApplicationRoot, "Logs"), "Log.tes"); } }
|
|
|
|
/// <summary>
|
|
/// Path della directory su cui memorizzo in modo temporaneo i file downloadati.
|
|
/// </summary>
|
|
public virtual string PathDownloadWorking { get { return Path.Combine(PathApplicationRoot, "Down"); } }
|
|
|
|
/// <summary>
|
|
/// Path della directory su cui riporto i file di indice, correttamente analizzati.
|
|
/// </summary>
|
|
public virtual string PathAnalizadedIndexFile {
|
|
get {
|
|
//// root/Down/YYYY-MM-DD/Index
|
|
//if (string.IsNullOrEmpty(pathAnalizadedIndexFile)) {
|
|
// // creo path e verifico l'esistenza
|
|
// pathAnalizadedIndexFile = Path.Combine(Path.Combine(PathDownloadWorking, DateTime.Now.ToString("yyyy-MM-dd")), "Index");
|
|
// if (!Directory.Exists(pathAnalizadedIndexFile)) Directory.CreateDirectory(pathAnalizadedIndexFile);
|
|
//}
|
|
// root/Txt/Idx/YYYY-MM-DD
|
|
if (string.IsNullOrEmpty(pathAnalizadedIndexFile)) {
|
|
// creo path e verifico l'esistenza
|
|
pathAnalizadedIndexFile = Path.Combine(Path.Combine(Path.Combine(PathApplicationRoot, "Txt"), "Idx"), DateTime.Now.ToString("yyyy-MM-dd"));
|
|
if (!Directory.Exists(pathAnalizadedIndexFile)) Directory.CreateDirectory(pathAnalizadedIndexFile);
|
|
}
|
|
return pathAnalizadedIndexFile;
|
|
}
|
|
}
|
|
private string pathAnalizadedIndexFile = "";
|
|
|
|
|
|
/// <summary>
|
|
/// Path della directory su cui riporto i file dei racconti, correttamente analizzati.
|
|
/// </summary>
|
|
public virtual string PathAnalizadedRaccFile {
|
|
get {
|
|
//// root/Down/YYYY-MM-DD/Testi
|
|
//if (string.IsNullOrEmpty(pathAnalizadedRaccFile)) {
|
|
// // creo path e verifico l'esistenza
|
|
// pathAnalizadedRaccFile = Path.Combine(Path.Combine(PathDownloadWorking, DateTime.Now.ToString("yyyy-MM-dd")), "Testi");
|
|
// if (!Directory.Exists(pathAnalizadedRaccFile)) Directory.CreateDirectory(pathAnalizadedRaccFile);
|
|
//}
|
|
// root/Txt/Src/YYYY-MM-DD
|
|
if (string.IsNullOrEmpty(pathAnalizadedRaccFile)) {
|
|
// creo path e verifico l'esistenza
|
|
pathAnalizadedRaccFile = Path.Combine(Path.Combine(Path.Combine(PathApplicationRoot, "Txt"), "Src"), DateTime.Now.ToString("yyyy-MM-dd"));
|
|
if (!Directory.Exists(pathAnalizadedRaccFile)) Directory.CreateDirectory(pathAnalizadedRaccFile);
|
|
}
|
|
return pathAnalizadedRaccFile;
|
|
}
|
|
}
|
|
private string pathAnalizadedRaccFile = "";
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/// <summary>
|
|
/// Path, relativo al plugin, del file con l'elenco dei link ai file di indice.
|
|
/// </summary>
|
|
public string FileIndexLinkPath { get { return fileIndexLinkPath; } set { fileIndexLinkPath = value; } }
|
|
private string fileIndexLinkPath;
|
|
|
|
/// <summary>
|
|
/// Path completo dell'applicazione esterna da usare per il download dei file dal web
|
|
/// </summary>
|
|
public string DownloaderPrg { get { return downloaderPrg; } set { downloaderPrg = value; } }
|
|
private string downloaderPrg;
|
|
|
|
/// <summary>
|
|
/// Path, relativo al plugin, del file di log per l'applicativo di download.
|
|
/// </summary>
|
|
public string FileDownloadLogPath { get { return fileDownloadLogPath; } set { fileDownloadLogPath = value; } }
|
|
private string fileDownloadLogPath;
|
|
|
|
/// <summary>
|
|
/// Directory, relativa al plugin, su cui vengono messi i file indice downloadati dal downloader.
|
|
/// </summary>
|
|
public string DownloadFolderIndex { get { return downloadFolderIndex; } set { downloadFolderIndex = value; } }
|
|
private string downloadFolderIndex;
|
|
|
|
/// <summary>
|
|
/// Directory, relativa al plugin, su cui vengono archiviati i file indice dopo l'analisi.
|
|
/// </summary>
|
|
public string ArchiveFolderIndex { get { return archiveFolderIndex; } set { archiveFolderIndex = value; } }
|
|
private string archiveFolderIndex;
|
|
|
|
/// <summary>
|
|
/// Path, relativo al plugin, del file con l'elenco dei link ai file dei singoli racconti.
|
|
/// </summary>
|
|
public string FileRaccLinkPath { get { return fileRaccLinkPath; } set { fileRaccLinkPath = value; } }
|
|
private string fileRaccLinkPath;
|
|
|
|
/// <summary>
|
|
/// Numero massimo di racconti da raccogliere su ciascun file di testo.
|
|
/// </summary>
|
|
public int NumRaccontiForFile { get { return numRaccontiForFile; } set { numRaccontiForFile = value; } }
|
|
private int numRaccontiForFile;
|
|
|
|
/// <summary>
|
|
/// Directory, relativa al plugin, su cui vengono archiviati i file dei racconti dopo l'analisi.
|
|
/// </summary>
|
|
public string ArchiveFolderRacc { get { return archiveFolderRacc; } set { archiveFolderRacc = value; } }
|
|
private string archiveFolderRacc;
|
|
|
|
/// <summary>
|
|
/// Struttura, relativa al plugin, del path dei file su cui raccolgo i racconti estratti.
|
|
/// </summary>
|
|
public string RaccontiExtractedFileName { get { return raccontiExtractedFileName; } set { raccontiExtractedFileName = value; } }
|
|
private string raccontiExtractedFileName;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Path del file da usare come log temporaneo del programma di download
|
|
/// </summary>
|
|
public string TmpLogPath { get { return tmpLogPath; } set { tmpLogPath = value; } }
|
|
private string tmpLogPath;
|
|
|
|
/// <summary>
|
|
/// Path del file con i link agli indici dei racconti, pronto per essere downloadato con _Down1.
|
|
/// </summary>
|
|
public string IndexLinkPath { get { return indexLinkPath; } set { indexLinkPath = value; } }
|
|
private string indexLinkPath;
|
|
|
|
/// <summary>
|
|
/// Path del file su cui memorizzo il DB dei link finora trovati.
|
|
/// </summary>
|
|
public string LinkDBPath { get { return linkDBPath; } set { linkDBPath = value; } }
|
|
private string linkDBPath;
|
|
|
|
/// <summary>
|
|
/// Path del file su cui scrivo i link dei racconti non precedentemente contenuti nel DB.
|
|
/// </summary>
|
|
public string LinkNewPath { get { return linkNewPath; } set { linkNewPath = value; } }
|
|
private string linkNewPath;
|
|
|
|
/// <summary>
|
|
/// Directory su cui voglio spostare i file degli indici downloadati.
|
|
/// </summary>
|
|
public string IndexDstFolder { get { return indexDstFolder; } set { indexDstFolder = value; } }
|
|
private string indexDstFolder;
|
|
|
|
/// <summary>
|
|
/// Directory contenente i file html, dei racconti, downloadati
|
|
/// </summary>
|
|
public string RaccontiSrcFolder { get { return raccontiSrcFolder; } set { raccontiSrcFolder = value; } }
|
|
private string raccontiSrcFolder;
|
|
|
|
/// <summary>
|
|
/// Directory su cui riporto i racconti estratti automaticamente dai file html
|
|
/// </summary>
|
|
public string RaccontiExtractFolder { get { return raccontiExtractFolder; } set { raccontiExtractFolder = value; } }
|
|
private string raccontiExtractFolder;
|
|
|
|
/// <summary>
|
|
/// Nome principale per i file su cui riporto i racconti estratti automaticamente.
|
|
/// </summary>
|
|
public string RaccontiExtractedFileName { get { return raccontiExtractedFileName; } set { raccontiExtractedFileName = value; } }
|
|
private string raccontiExtractedFileName;
|
|
|
|
/// <summary>
|
|
/// Numero di racconti massimo contenuti nel file di esportazione dei racconti estratti automaticamente.
|
|
/// </summary>
|
|
public int NumRaccontiForFile { get { return numRaccontiForFile; } set { numRaccontiForFile = value; } }
|
|
private int numRaccontiForFile;
|
|
|
|
|
|
//*/
|
|
|
|
#endregion
|
|
|
|
|
|
} // class Cfg
|
|
|
|
} // namespace A69WD
|
|
|
|
|