Subversion Repositories autosfx

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 daniel-mar 1
#include "stdafx.h"
2
#pragma hdrstop
3
#include "DZRaw.h"
4
#include "ZipDflt.h"
5
#include "ZipOp.h"
6
//#include "Zip.h"
7
//#include "ZipErr.h"
8
#include "dz_errs.h"
9
 
10
#undef _DZ_FILE_
11
#define _DZ_FILE_ DZ_ZIPSS_CPP
12
 
13
/* Win32Zip.c
14
 * Copyright (C) 1990-1996 Mark Adler, Richard B. Wales, Jean-loup Gailly,
15
 * Kai Uwe Rommel, Onno van der Linden and Igor Mandrichenko.
16
 * This version modified by Chris Vleghert and Eric Engler for BCB/Delphi Zip.
17
 ** distributed under LGPL license ** see license.txt for details
18
 
19
  Copyright (c) 1990-2007 Info-ZIP.  All rights reserved.
20
 
21
  See the accompanying file LICENSE, version 2007-Mar-4 or later
22
  (the contents of which are also included in zip.h) for terms of use.
23
  If, for some reason, all these files are missing, the Info-ZIP license
24
  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
25
 
26
  parts Copyright (C) 1997 Mike White, Eric W. Engler
27
************************************************************************
28
 Copyright (C) 2009, 2010  by Russell J. Peters, Roger Aelbrecht
29
 
30
   This file is part of TZipMaster Version 1.9.
31
 
32
    TZipMaster is free software: you can redistribute it and/or modify
33
    it under the terms of the GNU Lesser General Public License as published by
34
    the Free Software Foundation, either version 3 of the License, or
35
    (at your option) any later version.
36
 
37
    TZipMaster is distributed in the hope that it will be useful,
38
    but WITHOUT ANY WARRANTY; without even the implied warranty of
39
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
40
    GNU Lesser General Public License for more details.
41
 
42
    You should have received a copy of the GNU Lesser General Public License
43
    along with TZipMaster.  If not, see <http://www.gnu.org/licenses/>.
44
 
45
    contact: problems@delphizip.org (include ZipMaster in the subject).
46
    updates: http://www.delphizip.org
47
    DelphiZip maillist subscribe at http://www.freelists.org/list/delphizip
48
************************************************************************/
49
 
50
int ZipOp::ZipStreamStream(void)
51
{
52
    fwindow_size = 0L;
53
 
54
    if (fGEncrypt)
55
    {
56
        fkey = fGPassword;
57
 
58
        if (!fkey || !*(fkey))
59
        {
60
            // use global
61
            if (GetUserPW() != DZ_ERR_GOOD)
62
                return -1;  // error
63
 
64
            fkey = fuser_key;
65
        }
66
    }
67
 
68
    fZipInfile = new ZStream(this, _T("0:<INSTREAM>"), fSS->fSSInput);
69
 
70
    AutoStream inz(&fZipInfile);
71
    fimax = fSS->Size;
72
    fcrc = crc32(0L, NULL, 0);
73
    fisize = 0;
74
    CB->Arg1 = 1;
75
    CB->UserCB(zacCount);
76
 
77
    // Pass total filesize.
78
    CB->FileSize = fimax;
79
    CB->UserCB(zacSize);
80
    ulg f_crc = 0;
81
    __int64 fsz = 0;
82
    bool haveCRC = false;
83
 
84
    if (fkey)
85
    {
86
        if (!fNoPrecalc)
87
        {
88
            if (Verbose < 0)
89
                Notify(ITRACE,  _T("about to call Precalculate CRC"));
90
 
91
            // +++++ get CRC before we start
92
                        CB->UserXItem(fimax, 13, _T("*PreCalculate"));
93
            __int64 pos1 = 0;
94
 
95
            if (!fZipInfile->IsFile)
96
                pos1 = fZipInfile->SetPosition(0, FILE_CURRENT); // get start posn
97
 
98
                        f_crc = crc32(0L, NULL, 0);
99
            unsigned long byts;
100
 
101
            while (true)
102
            {
103
                unsigned ToRead = sizeof(fwindow);
104
 
105
                if (fimax > 0 && (fsz + ToRead) > fimax)
106
                {
107
                    ToRead = (unsigned)(fimax - fsz);
108
 
109
                    if (!ToRead)
110
                        break;
111
                }
112
 
113
                if (!fZipInfile->Read(fwindow, ToRead, &byts) || !byts)
114
                    break;
115
 
116
                                fsz += byts;
117
                                f_crc = crc32(f_crc, (const uch*)fwindow, byts);
118
                                CB->UserXProgress(byts, 13);
119
 
120
                if (Abort_Flag)
121
                                        Fatal(DZ_ERM_ABORT, 0);
122
            }
123
 
124
            fSS->CRC = f_crc;
125
 
126
            haveCRC = true;
127
            // reposition
128
 
129
            if (fZipInfile->SetPosition(pos1, FILE_BEGIN) != pos1)
130
            {
131
                if (Verbose)
132
                                        Notify(IVERBOSE, _T("Could not reposition %s [%s]"),
133
                                                fZipInfile->fname.c_str(), SysMsg().c_str());
134
 
135
                                return  DZError(DZ_ERM_ERROR_SEEK);
136
                        }
137
 
138
            if (fimax > fsz)
139
                fimax = fsz;
140
        }
141
 
142
        // ----- get CRC before we start
143
        // Since we do not yet know the crc here, we pretend that the crc is the
144
        //   modification time:
145
//    if (!haveCRC)
146
//      fSS->CRC = z->tim << 16;
147
        if (Verbose < 0)
148
            Notify(ITRACE,  _T("using supplied CRC %lu"), fSS->CRC);
149
    }
150
 
151
    // connect to output
152
    fZipOutfile = new ZStream(this, _T("0:<OUTSTREAM>"), fSS->fSSOutput);
153
 
154
    AutoStream outz(&fZipOutfile);
155
 
156
    CB->UserItem(fimax, _T("<INSTREAM>"));
157
 
158
        if (fkey)
159
                crypthead(fkey, fSS->CRC);  // write
160
 
161
    // Write stored or deflated file to zip file
162
    fSS->Method &= 0xFF;
163
 
164
    if (fSS->Method != DEFLATE)
165
        fSS->Method = 0;
166
 
167
    if (flevel < 1)
168
        fSS->Method = 0;
169
 
170
    int mthd = fSS->Method;
171
 
172
    if (mthd == DEFLATE)
173
    {
174
        if (Verbose < 0)
175
            Notify(ITRACE,  _T("about to call Deflate"));
176
 
177
        bi_init();
178
        ush att = BINARY;
179
        ush flg = FLAG_ENCRYPT_BIT;
180
 
181
        // will be changed in deflate()
182
        ct_init(&att, &mthd);
183
        lm_init(flevel, &flg);
184
 
185
        // PERFORM THE DEFLATE
186
        fSS->Size = deflate();
187
 
188
        if (Abort_Flag)
189
                        Fatal(DZ_ERM_ABORT, 0);
190
    }
191
    else
192
    {
193
        int k;
194
 
195
        if (Verbose)
196
            Notify(IVERBOSE, _T("Storing %s "), fZipInfile->fname.c_str());
197
 
198
        while ((k = read_buf(fwindow, sizeof(fwindow))) > 0
199
                && k != EOF)
200
        {
201
            if (Abort_Flag)
202
                                Fatal(DZ_ERM_ABORT, 0);
203
 
204
            if (!zfwrite(fwindow,  k))
205
                                return DZ_ERM_TEMP_FAILED;
206
        }
207
 
208
    }
209
    /* TODO 1 -oRP -cenhancement : Finished Item */
210
    CB->UserCB(zacEndOfBatch); // done with stream compression
211
 
212
    if (haveCRC)
213
    {
214
        if (f_crc != fcrc)
215
            Notify(DZ_ERR_ERROR_READ | IWARNING, _T(" File CRC changed while zipping: %s"),
216
                   fZipInfile->fname.c_str());
217
 
218
        if (fisize != fsz)
219
            Notify(DZ_ERR_ERROR_READ | IWARNING, _T(" File size changed while zipping: %s"),
220
                   fZipInfile->fname.c_str());
221
    }
222
 
223
    fSS->Size = fisize;
224
 
225
    fSS->CRC = fcrc;
226
    fSS->Method = mthd | (fkey ? 0xff00 : 0);
227
    return DZ_ERR_GOOD;
228
}
229
 
230