Subversion Repositories autosfx

Rev

Blame | Last modification | View Log | RSS feed

  1. #include "stdafx.h"
  2. #pragma hdrstop
  3. #include "enter.h"
  4. #include "dz_errs.h"
  5.  
  6. #undef _DZ_FILE_
  7. #define _DZ_FILE_ DZ_UNZEXEC_CPP
  8. /*
  9. unzmain.c -
  10.  
  11.   Copyright (c) 1990-2007 Info-ZIP.  All rights reserved.
  12.  
  13.   See the accompanying file LICENSE, version 2007-Mar-4 or later
  14.   (the contents of which are also included in zip.h) for terms of use.
  15.   If, for some reason, all these files are missing, the Info-ZIP license
  16.   also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
  17.  
  18.   parts Copyright (C) 1997 Mike White, Eric W. Engler
  19. ************************************************************************
  20.  Copyright (C) 2009, 2010  by Russell J. Peters, Roger Aelbrecht
  21.  
  22.    This file is part of TZipMaster Version 1.9.
  23.  
  24.     TZipMaster is free software: you can redistribute it and/or modify
  25.     it under the terms of the GNU Lesser General Public License as published by
  26.     the Free Software Foundation, either version 3 of the License, or
  27.     (at your option) any later version.
  28.  
  29.     TZipMaster is distributed in the hope that it will be useful,
  30.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  31.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  32.     GNU Lesser General Public License for more details.
  33.  
  34.     You should have received a copy of the GNU Lesser General Public License
  35.     along with TZipMaster.  If not, see <http://www.gnu.org/licenses/>.
  36.  
  37.     contact: problems@delphizip.org (include ZipMaster in the subject).
  38.     updates: http://www.delphizip.org
  39.     DelphiZip maillist subscribe at http://www.freelists.org/list/delphizip
  40. ************************************************************************/
  41.  
  42.  
  43. /* Main UnZip DLL module
  44. * This version modified by Chris Vleghert and Eric W. Engler
  45. * for BCB/Delphi Zip.
  46. * Based on Mike White's DLL, but is dissimilar in many ways.
  47. * This module has the entry point for the two calls from BCB and Delphi.
  48. */
  49.  
  50. #include "UnzOp.h"
  51. #include <excpt.h>
  52.  
  53. #define PWLEN 80
  54. /* ===================================================== */
  55.  
  56. long UnzOpr::Exec(const DllCommands *C)
  57. {
  58.   int FilesActedOn;
  59.  
  60.   if (Verbose < 0)
  61.         Notify(0,  _T("trace is on, UnzDllExec [%d %d %d]"), FCount,
  62.       ZCount, UCount);
  63.  
  64.   fzipfn = CB->UserArg(zcbFilename, 0, 0);
  65.   if (!fzipfn)
  66.   {
  67.     /* Something screwed up, we don't have a filename */
  68.         throw DZException(DZ_ERM_BAD_OPTIONS, _T("No zip filename received"));
  69.   }
  70.  
  71.   /* ---------------------------------------------------------------- */
  72.   if (Verbose < 0)
  73.     Notify(ITRACE, _T("ready to setup"));
  74.   if (FSetUpToProcessZipFile(C))
  75.   {
  76.     if (Verbose)
  77.     {
  78.         DZStrW tmp(DZ_Banner());
  79.         Notify(IVERBOSE, _T("Using %s"), tmp.c_str());
  80.         if (Verbose < 0)
  81.             Notify(ITRACE, _T("root = %s"), CurBase->Base);
  82.     }
  83.  
  84. //#ifdef USE_STRM_INPUT
  85. //    if (fUseInStream)
  86. //        MemExtract();
  87. //    else
  88. //    {
  89. //      if (fSS)
  90. //      {
  91. //        UnzStreamStream();
  92. //        if (Verbose < 0)
  93. //          Notify(ITRACE, _T("*** BACK FROM CALL TO unzip stream ***"));
  94. //      }
  95. //      else
  96. //      {
  97. //        process_zipfiles();   // Pass ptr to global bufs.
  98. //        if (Verbose < 0)
  99. //          Notify(ITRACE, _T("*** BACK FROM CALL TO process_zipfiles ***"));
  100. //      }
  101. //    }
  102. //#else
  103.     if (fSS)
  104.     {
  105.       UnzStreamStream();
  106.       if (Verbose < 0)
  107.         Notify(ITRACE, _T("*** BACK FROM CALL TO unzip stream ***"));
  108.     }
  109.     else
  110.     {
  111.           process_zipfiles();   // Pass ptr to global bufs.
  112.       if (Verbose < 0)
  113.         Notify(ITRACE, _T("*** BACK FROM CALL TO process_zipfiles ***"));
  114.     }
  115. //#endif
  116.  
  117.     if (Verbose)
  118.       Notify(IVERBOSE, _T("Files acted on = %d"), ffiles_acted_on);
  119.   }
  120.   FilesActedOn = ffiles_acted_on;
  121.   inflate_free();
  122.   TakeDownFromProcessZipFile();
  123.  
  124.   if (Verbose < 0)
  125.         GiveTime();
  126.  
  127.   if (Abort_Flag)
  128.   {
  129.     if (Abort_Flag & (GA_EXCEPT | GA_EXCEPT2))
  130.           return -DZ_ERR_CALLBACK;
  131.         if (Abort_Flag & GA_ABORT)
  132.           return -DZ_ERR_ABORT;
  133.     if (Abort_Flag & GA_CANCEL)
  134.           return -DZ_ERR_CANCELLED;
  135.   }
  136.   return FilesActedOn;
  137. }
  138.  
  139. /* =========================================================================== */
  140. bool UnzOpr::FSetUpToProcessZipFile(const DllCommands *C)
  141. {
  142. //  char * ExtDir, *tp;
  143. //  int len;
  144.  
  145.   fqflag = C->fOptions.Quiet; // quiet flag
  146.   if (Verbose < 0)
  147.     Notify(ITRACE, _T("FSetUpToProcessZipFile"));
  148.  
  149.   /* These flags all have a fixed value in this version. */
  150.   fextract_flag = 1;
  151.   ftflag = C->fOptions.OpIsTest;     /* if true, test zipfile */
  152.   fT_flag = 1;     /* -T: timestamps (unzip) or dec. time fmt (zipinfo) */
  153.  
  154.   // set options from caller
  155.   fcreate_dirs = C->fOptions.Directories; // used by main(), mapname(), checkdir()
  156.   fdflag = C->fOptions.Directories; // "recreate dir structure"
  157.   fjflag = !(fdflag);   // "junk pathnames"
  158.  
  159.   if (C->fHandle == 0)   // if we don't have a window handle, then
  160.     fqflag = true; // we need to be quiet (no dialog boxes)
  161.  
  162.   fuflag = C->fOptions.Update; // "Update" - extract only newer files & brand new files
  163.   ffflag = C->fOptions.Freshen; // "freshen" (extract only newer files)
  164.  
  165.   if (C->fOptions.Overwrite)
  166.     foverwrite_all = true; // Don't ask, always overwrite else Don't overwrite; skip that file.
  167.  
  168.   ffilespecs = 0; // number of fspecs
  169.  
  170. //#ifdef CRYPT
  171.   /* IMPORTANT! For ZIPDLL, the password is malloc'd, and then pointed-to
  172.   * by the global "key",  However, in UNZDLL, this is done:
  173.   * - "key" and "fkey" must remain NULL
  174.   * - fpwdarg must point to the password passed-in, or else must be NULL
  175.   * - fP_flag must be set to true if a password was passed-in */
  176.  
  177.   /* if no password, we will prompt user later (only if encrypted file found) */
  178.   fpwdarg = CB->UserArg(zcbPassword, 0, 0).c_str();
  179.   fP_flag = fpwdarg ? 1 : 0;
  180.   fPwdReqCount = C->fPwdReqCount & 0x0F;
  181. //#endif
  182.  
  183.   if (!C->fSS)
  184.   {
  185. //#ifdef USE_STRM_INPUT
  186. //  if (!C->fUseInStream)
  187. //  {
  188. //      if (_stati64(fzipfn, & fstatbuf) || (fstatbuf.st_mode & S_IFMT) == S_IFDIR)
  189. //        STRCAT(fzipfn, ZSUFX);
  190. //      if (_stati64(fzipfn, & fstatbuf))
  191. //      {
  192. //        Notify(IERROR, _T(" can't find zipfile [%s]"), fzipfn);
  193. //        return false;
  194. //      }
  195. //      else
  196. //        fziplen = fstatbuf.st_size;
  197. //  }
  198. //#else
  199.   if (_tstati64(fzipfn, & fstatbuf))
  200.   {
  201.     Notify(IERROR, _T(" can't find zipfile [%s]"), fzipfn.c_str());
  202.     return false;
  203.   }
  204.   else
  205.     fziplen = fstatbuf.st_size;
  206. //#endif
  207.   }
  208.  
  209.   if (Verbose < 0)
  210.         GiveTime();
  211.  
  212.   /*---------------------------------------------------------------------------
  213.   *     Ok, we have everything we need to get started.
  214.   *---------------------------------------------------------------------------*/
  215.   foutbuf = new uch[OUTBUFSIZ + 1];
  216.   finbuf = new uch[INBUFSIZ + 4];
  217.   frootlen = 0;
  218.   fhold = & finbuf[INBUFSIZ];
  219.   /* to check for boundary-spanning signatures */
  220.  
  221.   if (fSS)
  222.   {                                        
  223.       fredirect_pointer = 0;
  224.       fredirect_size = 0;
  225.     return true;
  226.   }
  227. //#ifdef USE_STRM_INPUT
  228. //  if (C->fUseInStream)
  229. //  {
  230. //    fUseInStream = C->fUseInStream;
  231. //    fInStream = C->fInStream;
  232. //    fInStreamSize = C->fInStreamSize;
  233. //  }
  234. //#endif
  235. //#ifdef USE_STRM_OUTPUT
  236. //  if (C->fUseOutStream)
  237. //  {
  238. //      fredirect_data = true;
  239. //      fbuffer_size = C->fOutStreamSize;
  240. //      fredirect_buffer = (unsigned char *) C->fOutStream;
  241. //#ifdef USE_STRM_INPUT
  242. //      if (fUseInStream)
  243. //      {
  244. //        fredirect_pointer = foutbuf; // Circular buffer inside DLL
  245. //        fredirect_size = OUTBUFSIZ;
  246. //    }
  247. //      else
  248. //    {
  249. //#endif
  250. //      fredirect_pointer = fredirect_buffer;
  251. //        fredirect_size = C->fOutStreamSize;
  252. //#ifdef USE_STRM_INPUT
  253. //      }
  254. //#endif
  255. //      if (!fredirect_buffer)
  256. //        return false;
  257. //  }
  258. //#endif
  259.   return true;
  260.   /* set up was OK */
  261. }
  262.  
  263.  
  264. /* ============================================================ */
  265. void UnzOpr::TakeDownFromProcessZipFile(void)
  266. {
  267.   if (finbuf)
  268.   {
  269.         delete[] finbuf;
  270.     finbuf = NULL;
  271.   }
  272.   if (foutbuf)
  273.   {
  274.         delete[] foutbuf;
  275.     foutbuf = NULL;
  276.   }
  277. }
  278.  
  279.  
  280.  
  281.