コード例 #1
0
ファイル: zip.c プロジェクト: 120239197a/SingleCore
extern MINIZIP_EXPORT int zipOpenNewFileInZip3 (zipFile file,const char* filename,const zip_fileinfo* zipfi,
                                                const void* extrafield_local,uInt size_extrafield_local,
                                                const void* extrafield_global,uInt size_extrafield_global,
                                                const char* comment,int method,int level,int raw,
                                                int windowBits,int memLevel,int strategy,
                                                const char* password,uLong crcForCrypting)

{
  zip_internal* zi;
  uInt size_filename;
  uInt size_comment;
  uInt i;
  int err = ZIP_OK;

#    ifdef NOCRYPT
  if (password != 0)
    return ZIP_PARAMERROR;
#    endif

  if (file == 0)
    return ZIP_PARAMERROR;
  if ((method!=0) && (method!=Z_DEFLATED))
    return ZIP_PARAMERROR;

  zi = (zip_internal*)file;

  if (zi->in_opened_file_inzip == 1)
    {
      err = zipCloseFileInZip (file);
      if (err != ZIP_OK)
        return err;
    }


  if (filename==0)
    filename="-";

  if (comment==0)
    size_comment = 0;
  else
    size_comment = (uInt)strlen(comment);

  size_filename = (uInt)strlen(filename);

  if (zipfi == 0)
    zi->ci.dosDate = 0;
  else
    {
      if (zipfi->dosDate != 0)
        zi->ci.dosDate = zipfi->dosDate;
      else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
    }

  zi->ci.flag = 0;
  if ((level==8) || (level==9))
    zi->ci.flag |= 2;
  if ((level==2))
    zi->ci.flag |= 4;
  if ((level==1))
    zi->ci.flag |= 6;
  if (password != 0)
    zi->ci.flag |= 1;

  zi->ci.crc32 = 0;
  zi->ci.method = method;
  zi->ci.encrypt = 0;
  zi->ci.stream_initialised = 0;
  zi->ci.pos_in_buffered_data = 0;
  zi->ci.raw = raw;
  zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;
  zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
    size_extrafield_global + size_comment;
  zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);

  ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
  /* version info */
  ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
  ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
  ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
  ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
  ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
  ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
  ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
  ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
  ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
  ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
  ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
  ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/

  if (zipfi==0)
    ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
  else
    ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);

  if (zipfi==0)
    ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
  else
    ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);

  ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);

  for (i=0;i<size_filename;i++)
    *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);

  for (i=0;i<size_extrafield_global;i++)
    *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
      *(((const char*)extrafield_global)+i);

  for (i=0;i<size_comment;i++)
    *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
      size_extrafield_global+i) = *(comment+i);
  if (zi->ci.central_header == 0)
    return ZIP_INTERNALERROR;

  /* write the local header */
  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);

  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);

  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);

  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);

  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */

  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);

  if (err==ZIP_OK)
    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);

  if ((err==ZIP_OK) && (size_filename>0))
    if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
      err = ZIP_ERRNO;

  if ((err==ZIP_OK) && (size_extrafield_local>0))
    if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)
        !=size_extrafield_local)
      err = ZIP_ERRNO;

  zi->ci.stream.avail_in = (uInt)0;
  zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
  zi->ci.stream.next_out = zi->ci.buffered_data;
  zi->ci.stream.total_in = 0;
  zi->ci.stream.total_out = 0;

  if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
    {
      zi->ci.stream.zalloc = (alloc_func)0;
      zi->ci.stream.zfree = (free_func)0;
      zi->ci.stream.opaque = (voidpf)0;

      if (windowBits>0)
        windowBits = -windowBits;

      err = deflateInit2(&zi->ci.stream, level,
                         Z_DEFLATED, windowBits, memLevel, strategy);

      if (err==Z_OK)
        zi->ci.stream_initialised = 1;
    }
#    ifndef NOCRYPT
  zi->ci.crypt_header_size = 0;
  if ((err==Z_OK) && (password != 0))
    {
      unsigned char bufHead[RAND_HEAD_LEN];
      unsigned int sizeHead;
      zi->ci.encrypt = 1;
      zi->ci.pcrc_32_tab = get_crc_table();
      /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/

      sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
      zi->ci.crypt_header_size = sizeHead;

      if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
        err = ZIP_ERRNO;
    }
#    endif

  if (err==Z_OK)
    zi->in_opened_file_inzip = 1;
  return err;
}
コード例 #2
0
ファイル: ZipSS.cpp プロジェクト: geoffsmith82/delphizip
int ZipOp::ZipStreamStream(void)
{
    fwindow_size = 0L;

    if (fGEncrypt)
    {
        fkey = fGPassword;

        if (!fkey || !*(fkey))
        {
            // use global
            if (GetUserPW() != DZ_ERR_GOOD)
                return -1;  // error

            fkey = fuser_key;
        }
    }

    fZipInfile = new ZStream(this, _T("0:<INSTREAM>"), fSS->fSSInput);

    AutoStream inz(&fZipInfile);
    fimax = fSS->Size;
    fcrc = crc32(0L, NULL, 0);
    fisize = 0;
    CB->SetArg1(1);
    CB->UserCB(zacCount);

    // Pass total filesize.
    CB->SetFileSize(fimax);
    CB->UserCB(zacSize);
    ulg f_crc = 0;
    __int64 fsz = 0;
    bool haveCRC = false;

    if (fkey)
    {
        if (!fNoPrecalc)
        {
            if (Verbose < 0)
                Notify(ITRACE,  _T("about to call Precalculate CRC"));

            // +++++ get CRC before we start
			CB->UserXItem(fimax, 13, _T("*PreCalculate"));
            __int64 pos1 = 0;

            if (!fZipInfile->IsFile)
                pos1 = fZipInfile->SetPosition(0, FILE_CURRENT); // get start posn

			f_crc = crc32(0L, NULL, 0);
            unsigned long byts;

            while (true)
            {
                unsigned ToRead = sizeof(fwindow);

                if (fimax > 0 && (fsz + ToRead) > fimax)
                {
                    ToRead = (unsigned)(fimax - fsz);

                    if (!ToRead)
                        break;
                }

                if (!fZipInfile->Read(fwindow, ToRead, &byts) || !byts)
                    break;

				fsz += byts;
				f_crc = crc32(f_crc, (const uch*)fwindow, (int)byts);
				CB->UserXProgress(byts, 13);

                if (Abort_Flag)
					Fatal(DZ_ERM_ABORT, 0);
            }

            fSS->CRC = f_crc;

            haveCRC = true;
            // reposition

            if (fZipInfile->SetPosition(pos1, FILE_BEGIN) != pos1)
            {
                if (Verbose)
					Notify(IVERBOSE, _T("Could not reposition %s [%s]"),
						fZipInfile->fname.c_str(), SysMsg().c_str());

				return  DZError(DZ_ERM_ERROR_SEEK);
			}

            if (fimax > fsz)
                fimax = fsz;
        }

        // ----- get CRC before we start
        // Since we do not yet know the crc here, we pretend that the crc is the
        //   modification time:
//    if (!haveCRC)
//      fSS->CRC = z->tim << 16;
        if (Verbose < 0)
            Notify(ITRACE,  _T("using supplied CRC %lu"), fSS->CRC);
    }

    // connect to output
    fZipOutfile = new ZStream(this, _T("0:<OUTSTREAM>"), fSS->fSSOutput);

    AutoStream outz(&fZipOutfile);

    CB->UserItem(fimax, _T("<INSTREAM>"));

	if (fkey)
		crypthead(fkey, fSS->CRC);  // write

    // Write stored or deflated file to zip file
    fSS->Method &= 0xFF;

    if (fSS->Method != DEFLATE)
        fSS->Method = 0;

    if (flevel < 1)
        fSS->Method = 0;

	int mthd = (int)fSS->Method;

    if (mthd == DEFLATE)
    {
        if (Verbose < 0)
            Notify(ITRACE,  _T("about to call Deflate"));

        bi_init();
        ush att = BINARY;
        ush flg = FLAG_ENCRYPT_BIT;

        // will be changed in deflate()
        ct_init(&att, &mthd);
        lm_init(flevel, &flg);

        // PERFORM THE DEFLATE
        fSS->Size = deflate();

        if (Abort_Flag)
			Fatal(DZ_ERM_ABORT, 0);
    }
    else
    {
        int k;

        if (Verbose)
            Notify(IVERBOSE, _T("Storing %s "), fZipInfile->fname.c_str());

        while ((k = read_buf(fwindow, sizeof(fwindow))) > 0
                && k != EOF)
        {
            if (Abort_Flag)
				Fatal(DZ_ERM_ABORT, 0);

			if (!zfwrite(fwindow,  (extent)k))
				return DZ_ERM_TEMP_FAILED;
        }

    }
    /*  Finished Item */
    CB->UserItem(-1, _T("<INSTREAM>")); // mark end of item
    CB->UserCB(zacEndOfBatch); // done with stream compression

    if (haveCRC)
    {
        if (f_crc != fcrc)
            Notify(DZ_ERR_ERROR_READ | IWARNING, _T(" File CRC changed while zipping: %s"),
                   fZipInfile->fname.c_str());

        if (fisize != fsz)
            Notify(DZ_ERR_ERROR_READ | IWARNING, _T(" File size changed while zipping: %s"),
                   fZipInfile->fname.c_str());
    }

    fSS->Size = fisize;

    fSS->CRC = fcrc;
    fSS->Method = (DWORD)mthd | (fkey ? 0xff00 : 0);
    return DZ_ERR_GOOD;
}