Subversion Repositories autosfx

Rev

Blame | Last modification | View Log | RSS feed

  1. #include "stdafx.h"
  2. #pragma hdrstop
  3. #include "zipOp.h"
  4. #include "dz_errs.h"
  5.  
  6. #undef _DZ_FILE_
  7. #define _DZ_FILE_ DZ_ZIPSEL_CPP
  8.  
  9. /*
  10.   ZipSel.cpp - common definitions and functions
  11.  
  12.   Copyright (c) 1990-2007 Info-ZIP.  All rights reserved.
  13.  
  14.   See the accompanying file LICENSE, version 2007-Mar-4 or later
  15.   (the contents of which are also included in zip.h) for terms of use.
  16.   If, for some reason, all these files are missing, the Info-ZIP license
  17.   also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
  18.  
  19.   parts Copyright (C) 1997 Mike White, Eric W. Engler
  20. ************************************************************************
  21.  Copyright (C) 2009, 2010  by Russell J. Peters, Roger Aelbrecht
  22.  
  23.    This file is part of TZipMaster Version 1.9.
  24.  
  25.     TZipMaster is free software: you can redistribute it and/or modify
  26.     it under the terms of the GNU Lesser General Public License as published by
  27.     the Free Software Foundation, either version 3 of the License, or
  28.     (at your option) any later version.
  29.  
  30.     TZipMaster is distributed in the hope that it will be useful,
  31.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  32.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  33.     GNU Lesser General Public License for more details.
  34.  
  35.     You should have received a copy of the GNU Lesser General Public License
  36.     along with TZipMaster.  If not, see <http://www.gnu.org/licenses/>.
  37.  
  38.     contact: problems@delphizip.org (include ZipMaster in the subject).
  39.     updates: http://www.delphizip.org
  40.     DelphiZip maillist subscribe at http://www.freelists.org/list/delphizip
  41. ************************************************************************/
  42. #if 0
  43. // ** moved to DzOp
  44. DZStrW ZipOp::ConvExclFilters(const DZStrW & filters)
  45. {
  46.     DZStrW exc;
  47.     if (filters.IsEmpty())
  48.         return exc;
  49.     int n = 0;
  50.     if (filters[0] == _T('|'))
  51.     {
  52.                 exc = _T("|");
  53.         n++;
  54.     }
  55.     int len = filters.length();
  56.     while (n < len)
  57.     {                        
  58.         int nx = filters.Find(_T('|'), n+1);
  59.         if (nx < 0)
  60.             nx = len + 1;
  61.         DZStrW comp = filters.Mid(n, nx - n);
  62.         n = nx + 1;
  63.         comp.Trim();
  64.                 DZStrW p = ex2IntForm(comp, true);
  65.  
  66.         if (!p.IsEmpty())
  67.         {
  68.             if (!exc.IsEmpty())
  69.                 exc += _T('|');
  70.             exc += p;
  71.         }
  72.     }
  73.     return exc;
  74. }
  75.  
  76. DZStrW ZipOp::MakeExclFilters(void)
  77. {
  78.     DZStrW exc;
  79.     int n = 0;
  80.     while (true)
  81.     {
  82.         DZStrW arg = CB->UserArg(zcbFSpecArgsExcl, n, 0);
  83.  
  84.         if (arg.IsEmpty())
  85.             break;
  86.  
  87.         if (!exc.IsEmpty())
  88.             exc += _T('|');
  89.         exc += arg;
  90.         n++;
  91.     }
  92.  
  93.         return ConvExclFilters(exc);
  94. }
  95. #endif
  96.  
  97. int ZipOp::MakeSpecials(void)
  98. {
  99.     DZStrW delims(_T(":;,"));
  100.  
  101.     ZFilter *spcl, *top = 0;
  102.     DZStrW s, l, e, o;
  103.     int len, v, cnt = 0;
  104.     int posn, nxt;
  105.     e = CB->UserArg(zcbSpecials, 0, 0);
  106.  
  107.     len = e.length();
  108.     if (len && Verbose < 0)
  109.         Notify(IVERBOSE, _T("Do not compress: \"%s\""), e.c_str());
  110.     posn = 0;
  111.  
  112.     while (posn < len)
  113.     {
  114.                 nxt = e.FindOneOf(delims, posn);
  115.  
  116.         if (nxt < 0)
  117.             nxt = len;
  118.  
  119.         int ol = nxt - posn;
  120.         o = e.Mid(posn, ol).Trim();
  121.         posn = nxt + 1;
  122.         if (o.IsEmpty())
  123.             continue;
  124.  
  125.         v = 0;      // level
  126.         int n = o.Find(_T('|'));
  127.  
  128.         if (n > 0)
  129.         {
  130.             l = o.Mid(n + 1).TrimLeft();
  131.             o = o.Left(n - 1).TrimRight();
  132.  
  133.             if (o.IsEmpty())
  134.                 continue;
  135.  
  136.             if (!l.IsEmpty())
  137.                 v = ((int)l[0]) & 15;
  138.         }
  139.  
  140.         // make filter
  141.         o.Insert(0, _T('*'));
  142.  
  143.         spcl = new ZFilter(o);
  144.  
  145.         spcl->Level = v;
  146.  
  147.         if (fSpecials == NULL)
  148.             fSpecials = spcl;
  149.         else
  150.             top->Next = spcl;
  151.  
  152.         top = spcl;
  153.  
  154.         cnt++;
  155.     }
  156.  
  157.     return cnt;
  158. }
  159.  
  160. /* =========================================================================== */
  161. //#ifdef CRYPT
  162. int ZipOp::GetUserPW(void)
  163. {
  164.     if (fuser_key && *(fuser_key))
  165.         return DZ_ERR_GOOD;
  166.  
  167.     // get password from user
  168.     diag(_T("DLL was not passed a password"));
  169.  
  170.     CB->Arg1 = 1;        // request cnt
  171.     if (CB->UserCB(zacPassword) == CALLBACK_TRUE)
  172.     {
  173.         DZStrW pw(CB->Msg, PWLEN);
  174.         fkey = fuser_key = AddPW(pw, false);
  175.     }
  176.     else
  177.                 return DZ_ERM_PASSWORD_CANCEL;
  178.  
  179.     if (Verbose)
  180.         Notify(IVERBOSE, _T("passwords match: %s"), fkey);
  181.  
  182.     return DZ_ERR_GOOD;
  183. }
  184. //#endif
  185.  
  186. /* ===========================================================================
  187.      select files to be processed
  188. */
  189. int ZipOp::ZipSelect(const DllCommands *C)
  190. {
  191.     int r; // temporary variable
  192.     long g_before = fbefore; // 1.74 global 'before'
  193.     int g_recurse = frecurse;
  194.     int g_level = C->fLevel;
  195.     g_level = g_level < 0 ? 0 : (g_level > 9 ? 9 : g_level);
  196.         bool encrypt;
  197.         int argno;
  198.  
  199. #ifdef DEBUG
  200.     fToTest = 0;
  201.     fTested = 0;
  202. #endif
  203.     fOldFAT = IsFileSystemOldFAT(fRootDir);
  204.     MakeSpecials();
  205.     DZStrW g_excludes = MakeExclFilters();   // Process arguments
  206.     if (Verbose < 0)
  207.         Notify(IVERBOSE, _T("Exclude: \"%s\""), g_excludes.c_str());
  208.     diag(_T("ready to read zip file"));
  209.  
  210.     // the read will be done in file: zipfile.c
  211.     if ((r = readzipfile()) != DZ_ERR_GOOD)
  212.     {
  213.         diag(_T("err returned from \"readzipfile\""));
  214.         return DZError(r);
  215.     }
  216.  
  217.     if (faction == UPDATE || faction == FRESHEN)
  218.         fdoall = 1;
  219.  
  220.     r = 0;
  221.  
  222.         bool ExcChanged = true;
  223.         DZStrW arg, spec, pwd, opt, tmp, theArg;
  224.  
  225.     for (argno = 0; !r; argno++)
  226.     {
  227.         spec.Empty();
  228.         pwd.Empty();
  229.         if (ExcChanged)
  230.         {
  231.             fExcludes = g_excludes;
  232.             if (Verbose < 0)
  233.                 Notify(IVERBOSE, _T("Exclude now: \"%s\""), fExcludes.c_str());
  234.             ExcChanged = false;
  235.         }
  236.         arg = CB->UserArg(zcbFSpecArgs, argno, 0);
  237.  
  238.                 arg.TrimLeft();
  239.         if (arg.IsEmpty())
  240.             break;   // ran out of args
  241.  
  242.         // reset globals
  243.         fkey = 0;
  244.         frecurse = g_recurse;
  245.         flevel = g_level;
  246.         fbefore = g_before;
  247.         encrypt = fGEncrypt;
  248.         AddBase(fRootDir, true);
  249.                 AddPW(fGPassword, true);
  250.  
  251.                 unsigned index = 0;
  252.                 TCHAR ch = arg[0];
  253.                 if (ch == ZForceNoRecurse || ch == ZForceRecurse)
  254.                 {
  255.                         index = 1;
  256.                         frecurse = (ch == ZForceNoRecurse)? 0 : 1;
  257.                 }
  258.  
  259.                 theArg = GetArg(arg, index, true);
  260.                 int ffnerr = CleanPath(theArg, spec);//, checkA);
  261.                 if (ffnerr < 0 || spec.IsEmpty())
  262.                 {
  263.                         Notify(IWARNING, _T("skipping invalid search spec %s"), arg.c_str());
  264.                         if (Skipping(arg, 0, SKIPPED_BAD_NAME))
  265.                                 Fatal(DZ_ERM_SKIPPED, 2);
  266.                         continue;
  267.                 }
  268.                 // check switches
  269.                 while (arg[index] == '/')
  270.                 {
  271.                         // process switches
  272.                         theArg = GetArg(arg, ++index, true);
  273.                         if (theArg.length() < 1)
  274.                                 continue;
  275.                         ch = theArg[0]; // the switch
  276.                         if (ch > _T('z') || ch < _T('A'))
  277.                                 continue;       // invalid
  278.                         if (ch >= _T('a'))
  279.                                 ch &= 0xDF;     // uppercase
  280.  
  281.                         if (theArg[1] == _T(':'))
  282.                         {
  283.                                 switch (ch)
  284.                                 {
  285.                                         case _T('C'):
  286.                                                 if (_istdigit(theArg[2]))
  287.                                                 {
  288.                                                         // new compression level
  289.                                                         flevel = theArg[2] - _T('0');
  290.                                                 }
  291.                                                 break;
  292.                                         case _T('F'):
  293.                                                 // new base
  294.                                                 theArg = theArg.Mid(2);
  295.                                                 if (theArg.IsEmpty())
  296.                                                 {
  297.                                                         // use current dir
  298.                                                         if (!GetFullPathName(_T(".\\"), MAX_PATH, theArg.GetBuffer(MAX_PATH), NULL))
  299.                                                                 throw DZFatalException(DZ_ERM_MEMORY);
  300.                                                         theArg.ReleaseBuffer();
  301.                                                 }
  302.                                                 if (theArg.LastChar() != BSLASH)
  303.                                                         theArg += BSLASH;
  304.  
  305.                                                 if (!CleanPath(theArg, tmp))//, checkA))
  306.                                                 {
  307.                                                         AddBase(tmp, true);
  308.  
  309.                                                         if (Verbose < 0)
  310.                                                                 Notify(IWARNING, _T("Root dir now %s"), tmp.c_str());
  311.                                                 }
  312.                                                 break;
  313.                                         case _T('E'):
  314.                                                 tmp = ConvExclFilters(theArg.Mid(2));
  315.                                                 if (tmp.IsEmpty())
  316.                                                         fNoExtChk = 1;
  317.                                                 else
  318.                                                 if (tmp[0] == _T('|'))
  319.                                                         tmp = g_excludes + tmp; // append the new ones
  320.                                                 fExcludes = tmp;
  321.                                                 ExcChanged = true;
  322.  
  323.                                                 if (Verbose < 0)
  324.                                                         Notify(IVERBOSE, _T("Exclude now: \"%s\""), fExcludes.c_str());
  325.                                                 break;
  326.                                 default:
  327.                                         if (Verbose < 0)
  328.                                                 Notify(IWARNING, _T("Ignoring invalid switch %s"), theArg.c_str());
  329.                                 }
  330.                                 continue;
  331.                         }
  332.                         if (ch == _T('S'))
  333.                         {
  334.                                 if (theArg.length() == 1)
  335.                                 {
  336.                                         frecurse = 1;
  337.                                         frecurse = 1;
  338.                                 }
  339.                                 if (theArg.length() == 2 && theArg[1] == _T('-'))
  340.                                 {
  341.                                         frecurse = 0;
  342.                                 }
  343.                                 continue;
  344.                         }
  345.                         if (Verbose < 0)
  346.                                 Notify(IWARNING, _T("Ignoring invalid switch %s"), theArg.c_str());
  347.                 }
  348.                 if (arg[index] == ZPasswordFollows)
  349.                 {
  350.                         pwd = arg.Mid(++index);
  351.                         encrypt = !pwd.IsEmpty();
  352.                 }
  353.  
  354.         fpcount = fExcludes.IsEmpty() ? 0 : 1;
  355.  
  356. //#ifdef CRYPT
  357.                 if (encrypt)
  358.                 {
  359.                         // use global unless there is override
  360.                         if (pwd.IsEmpty())
  361.                                 fkey = AddPW(fGPassword, true);
  362.                         else
  363.                                 fkey = AddPW(pwd, true);
  364.  
  365.                         if (!fkey || !*(fkey))
  366.                         {
  367.                                 // use global
  368.                                 if ((r = GetUserPW()) != DZ_ERR_GOOD)
  369.                                         break;
  370.  
  371.                                 fkey = fuser_key;
  372.                         }
  373.                 }
  374. //#endif
  375.                 fOldFAT = IsFileSystemOldFAT(spec);
  376.  
  377.         fdoall = 0; // do selected
  378.         if (Is_Drv(spec) < 0)
  379.         {
  380.             if (Verbose < 0)
  381.                 Notify(IVERBOSE, _T("Collecting stream %s"), spec.c_str());
  382.  
  383.             r = procname(spec, false);
  384.         }
  385.         else
  386.         {
  387.             if ((faction == ADD) || (faction == UPDATE))
  388.             {
  389.                 if (Verbose < 0)
  390.                     Notify(IVERBOSE, _T("Collecting %s %s"), spec.c_str(),
  391.                            (frecurse ? _T("recurse") : _T(" ")));
  392.  
  393.                 r = Wild(spec);
  394.             }
  395.             else    // Freshen or Delete - must be internal file
  396.             {
  397.                 if (Verbose < 0)
  398.                     Notify(IVERBOSE, _T("collecting %s %s"), spec.c_str(),
  399.                            (frecurse ? _T("recurse") : _T(" ")));
  400.  
  401.                 r = procname(spec, frecurse);
  402.             }
  403.         }
  404.  
  405.                 if (r != DZ_ERR_GOOD &&
  406.                         (DZ_ERR(r) == DZ_ERR_MISS || DZ_ERR(r) == DZ_ERR_INVAL_NAME))
  407.                 {
  408.                         /* this occurs if new file wasn't found */
  409.                         Notify(r, _T("File specification \"%s\" skipped"), spec.c_str());
  410. //                      r = DZ_ERR_GOOD;
  411.                         if (Skipping(arg, 0,
  412.                                 (DZ_ERR(r) == DZ_ERR_MISS) ? SKIPPED_NO_FILES : SKIPPED_BAD_NAME))
  413.                                 r = DZ_ERM_SKIPPED;
  414.                         else
  415.                                 r = DZ_ERR_GOOD;
  416. //            }
  417.                 }
  418.  
  419.         if (r)
  420.             return DZError(r);
  421.         if (Abort_Flag)
  422.                         Fatal(DZ_ERM_ABORT, 0);
  423.     }
  424. //#ifdef DEBUG
  425. //    if (Verbose)
  426. //        Notify(IDIAG, "Filter tests - did %Lu of %Lu", fTested, fToTest);
  427. //#endif
  428.     return DZ_ERR_GOOD;
  429. }
  430.  
  431.  
  432.  
  433.  
  434.  
  435.