campo-sirio/xvaga/agasys.cpp
guy e579568335 Patch level : 4.0
Files correlati     : xvaga,dll
Ricompilazione Demo : [ ]
Commento            :
Migliorata gestione stampanti con driver troppo pretenziosi:
se hanno piu' di 4096 bytes di parametri extra, questi vengono ignorati.
Tale sotterfugio serve per impedire di nuocere alla stampante Konica del CRPA


git-svn-id: svn://10.65.10.50/trunk@14134 c028cbd2-c16b-5b4b-a496-9718f37d4682
2006-06-29 15:35:17 +00:00

171 lines
4.0 KiB
C++
Executable File

#include "wxinc.h"
#ifdef LINUX
#include "xvt_type.h"
#include "incstr.h"
#else
#include <fstream.h>
#endif
#include "agasys.h"
///////////////////////////////////////////////////////////
// Unzip support
///////////////////////////////////////////////////////////
#include <wx/dir.h>
#include <wx/progdlg.h>
#include <wx/wfstream.h>
#include <wx/zipstrm.h>
static unsigned int aga_getziplist(const char* zipfile, wxArrayString& aFiles)
{
wxFFileInputStream fin(zipfile);
wxZipInputStream zip(fin);
for (wxZipEntry* z = zip.GetNextEntry(); z; z = zip.GetNextEntry())
{
const wxString str = z->GetInternalName();
aFiles.Add(str);
}
return aFiles.GetCount();
}
static int aga_find_slash(const wxString& path, int from)
{
for (int i = from; path[i]; i++)
if (wxIsPathSeparator(path[i]))
return i;
return -1;
}
static void aga_create_dir(wxString strPath)
{
if (!wxEndsWithPathSeparator(strPath))
strPath += wxFILE_SEP_PATH;
for (int i = aga_find_slash(strPath, 0); i > 0; i = aga_find_slash(strPath, i+1))
{
const wxString strDir = strPath.Mid(0,i);
if (!::wxDirExists(strDir))
::wxMkdir(strDir);
}
}
bool aga_unzip(const char* zipfile, const char* destdir)
{
wxArrayString aFiles;
const unsigned int files = aga_getziplist(zipfile, aFiles);
wxProgressDialog pi("Unzip", "", files, NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT);
for (unsigned int f = 0; f < files; f++)
{
const wxString& strFileName = aFiles[f];
if (!pi.Update(f, strFileName))
break;
if (wxEndsWithPathSeparator(strFileName) || strFileName.Find('.') < 0) // Is dir name
{
wxString strOutDir = destdir;
if (!wxEndsWithPathSeparator(strOutDir))
strOutDir += wxFILE_SEP_PATH;
strOutDir += strFileName;
if (!::wxDirExists(strOutDir))
::wxMkdir(strOutDir);
}
else
{
wxZipInputStream fin(zipfile, strFileName);
wxString strOutFile = destdir;
if (!wxEndsWithPathSeparator(strOutFile) && !wxIsPathSeparator(strFileName[0]))
strOutFile += wxFILE_SEP_PATH;
strOutFile += strFileName;
wxString strPath;
::wxSplitPath(strOutFile, &strPath, NULL, NULL);
aga_create_dir(strPath);
wxFileOutputStream fout(strOutFile);
fout.Write(fin);
}
}
return files > 0;
}
///////////////////////////////////////////////////////////
// Zip support
///////////////////////////////////////////////////////////
static void AddFileToZip(const wxString& strPrefix, const wxString& strFile,
wxZipOutputStream& zip)
{
if (!wxFileExists(strFile))
return;
wxString strPath, strName, strExt;
wxSplitPath(strFile, &strPath, &strName, &strExt);
wxString strRelName;
strRelName = strPath.Mid(strPrefix.Length());
if (!strRelName.IsEmpty())
strRelName += '/';
strRelName += strName;
strRelName += '.';
strRelName += strExt;
zip.PutNextEntry(strRelName);
wxFileInputStream fin(strFile);
zip.Write(fin); // Scrivo file compresso
}
static bool AddFilesToZip(const wxString& strBase, wxArrayString& aFiles, const char* zipfile)
{
wxFFileOutputStream out(zipfile);
wxZipOutputStream zip(out);
const size_t nFiles = aFiles.GetCount();
wxProgressDialog pi("Zip", "", nFiles, NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT);
for (size_t i = 0; i < nFiles; i++)
{
const wxString& str = aFiles[i];
if (!pi.Update(i, str))
break;
AddFileToZip(strBase, str, zip);
}
return true;
}
bool aga_zip(const char* srcfiles, const char* zipfile)
{
wxString strBase, strMask, strExt;
wxSplitPath(srcfiles, &strBase, &strMask, &strExt);
strMask += '.';
strMask += strExt;
wxArrayString aFiles;
wxDir::GetAllFiles(strBase, &aFiles, strMask);
return AddFilesToZip(strBase, aFiles, zipfile);
}
bool aga_zip_filelist(const char* filelist, const char* zipfile)
{
wxArrayString aFiles;
ifstream fin(filelist);
while (!fin.eof())
{
char name[_MAX_PATH];
fin.getline(name, sizeof(name));
if (*name)
aFiles.Add(name);
else
break;
}
return AddFilesToZip("", aFiles, zipfile);
}