﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
922	Utilidades TOL de compresión y archivado de ficheros y directorios	Víctor de Buen Remiro	Víctor de Buen Remiro	"Es cada vez más necesario tener un mecanismo de compresión y archivado de ficheros y directorios que permitan leer y escribir directamente desde TOL archivos .zip, .7z, .gz, .tgz, tar, ...

Cada tipo de archivo tiene un motor y una SDK completamente distinto y podría ser muy lioso crear funciones built-in en TOL para el manejo de cada uno de ellos.

Lo más cómodo de utilizar para un usuario sería una jerarquía de clases con una clase básica abstracta con los métodos comunes que en un principio podrían ser estos

{{{
Class @Store
{
  //Identificador del motor de compresión 
  Text _.engine;
  //Extensión por defecto para los archivos
  Text _.ext;
  //Ubicación física del archivo en el disco local
  Text _.path = """";
  //Indica si el archivo está correctamente abierto
  Real _.isOpen = False;
  //Abre el archivo para lectura o escritura
  Real Open(Text path, Text readOrWrite);
  //Cierra el archivo
  Real Close(Real void);
  //Añade un fichero al archivo
  Real File.Add(Set originalFilePath);
  //Extrae un fichero del archivo
  Real File.Extract(Text originalFilePath, Text destinationDirPath);
  //Determina si existe o no un fichero dentro del archivo
  Real File.Exists(Text originalFilePath)
  //Añade un directorio completo recursivamente
  Real Dir.Add(Text originalDirPath);
  //Extrae un directorio completo recursivamente
  Real Dir.Extract(Text originalDirPat, Text destinationDirPath);
  //Determina si existe o no un directorio dentro del archivo
  Real Dir.Exists(Text originalFilePath);

  Real __destroy (Real void)  
  {
    If(_.isOpen, Close(void))
  }

};
}}}

El destructor se encargaría de cerrar el archivo si no lo ha hecho el usuario previamente. Luego se podrían añadir otros métodos conforme se hicieran necesarios. De esta clase básica se podría luego heredar una clase para cada motor que se quiera manejar:

{{{
Class @ZipArchive: @Store 
{ 
  Text _.engine = ""ZLib"";
  Text _.engine = "".zip"";
  ... 
};
Class @SevenZip: @Store { ... };
{ 
  Text _.engine = ""LZMA"";
  Text _.ext = "".7z"";
  ... 
};
Class @Rar: @Store { ... };
{ 
  Text _.engine = ""Rar"";
  Text _.ext = "".rar"";
  ... 
};
Class @Tar: @Store { ... };
{ 
  Text _.engine = ""Tar"";
  Text _.ext = "".tar"";
  ... 
};

}}}

Toda esta jerarquía de clases sería conveniente distribuirla como un paquete oficial que podría llamarse {{{PackArchive}}}. Cada na de ellas podría añadir miembros opcionales de configuración pero siempre con valores por defecto. Finalmente se podría hacer un método constructor que creara una instancia con la clase adecuada al motor de forma que el usuario no tuviera que conocer los intríngulis  para hacer las tareas normales, sino que le bastara con entender la API de la clase base {{{PackArchive::@Store}}}

{{{
@Store Create(Text engine, Text path, Text readOrWrite)
}}}

Evidentemente haría falta implementar alguna función TOL built-in en C++ que facultara la conexión con los distintos SDK, pero ya no haría falta más que una función para cada método que tomara como primer argumento la propia instancia de clase. 

{{{
  //Abre el archivo para lectura o escritura
  Real PackArchive.Open(NameBlock archive, Text path, Text readOrWrite);
  //Cierra el archivo
  Real PackArchive.Close(NameBlock archive);
  //Añade un fichero al archivo
  Real PackArchive.File.Add(NameBlock archive, Set originalFilePath);
  //Extrae un fichero del archivo
  Real PackArchive.File.Extract(NameBlock archive, Text originalFilePath, Text destinationDirPath);
  //Determina si existe o no un fichero dentro del archivo
  Real PackArchive.File.Exists(NameBlock archive, Text originalFilePath)
  //Añade un directorio completo recursivamente
  Real PackArchive.Dir.Add(NameBlock archive, Text originalDirPath);
  //Extrae un directorio completo recursivamente
  Real PackArchive.Dir.Extract(NameBlock archive, Text originalDirPat, Text destinationDirPath);
  //Determina si existe o no un directorio dentro del archivo
  Real PackArchive.Dir.Exists(NameBlock archive, Text originalFilePath)
}}}

Lo ideal sería que estas funciones se crearan como una DLL aparte de TOL que se cargara dinámicamente y de forma local, para que fuera un paquete completamente opcional. Si no es posible esto, de momento se puede enlazar internamente con tol.dll y distribuirse el paquete como parte de la StdLib.
"	task	closed	highest	TOL Extensions	System	head	blocker	fixed		
