action.c
上传用户:jlteech
上传日期:2007-01-06
资源大小:349k
文件大小:21k
源码类别:

压缩解压

开发平台:

Visual C++

  1. /* Action.c module of WizUnZip.
  2.  * Author: Robert A. Heath, 1993
  3.  * I, Robert Heath, place this source code module in the public domain.
  4.  *
  5.  * Modifications: Mike White 1995, 1996
  6.  * Now modified for WiZ - WizUnZip no longer exists
  7.  */
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #ifndef  WIN32
  12. #  include <dos.h>
  13. #  include <ctype.h>
  14. #endif
  15. #include "wiz.h"
  16. #include "unzipwindlldecs.h"
  17. #include "helpids.h"
  18. #ifdef ZE_MEM
  19. #undef ZE_MEM
  20. #define ZE_MEM 4
  21. #endif
  22. #include "ziperr.h"
  23. int argc;
  24. char **argv;
  25. extern BOOL fUpdateEntries;
  26. extern BOOL fSpool;
  27. extern char szRefDir[PATH_MAX];
  28. extern LPSTR szFileList;
  29. extern HANDLE hFileList;
  30. unsigned long dSpaceToUse;
  31. char __based(__segname("STRINGS_TEXT")) szNoMemory[] =
  32.             "Insufficient memory for this operation!";
  33. char __based(__segname("STRINGS_TEXT")) szCantChDir[] =
  34.          "Can't change directory to %s!";
  35. BOOL IsValidArchive(LPSTR archive)
  36. {
  37. int retcode, AllCodes = FALSE;
  38. hSaveCursor = SetCursor(hHourGlass);
  39. ShowCursor(TRUE);
  40. retcode = (*Unz_Validate)((char *)archive, AllCodes);
  41. ShowCursor(FALSE);
  42. SetCursor(hSaveCursor);
  43. return retcode;
  44. }
  45. /* Get Selection Count returns a count of the selected
  46.  * list box items. If the count is  greater than zero, it also returns
  47.  * a pointer to a locked list in local memory of the item nos.
  48.  * and their local memory handle.
  49.  *
  50.  * A value of -1 indicates an error.
  51.  *
  52.  * Note the WIN32 version does not use the parameter hListBox
  53.  */
  54. #ifdef __BORLANDC__
  55. #pragma argsused
  56. #endif
  57. int CLBItemsGet(HWND hListBox, int __far * __far *ppnSelItems, HANDLE *phnd)
  58. {
  59. #ifndef WIN32
  60. int cSelLBItems = (int)SendMessage(hListBox, LB_GETSELCOUNT, 0, 0L);
  61. #else
  62. int i, j, k = 0;
  63. LV_ITEM lvi;
  64. int cSelLBItems = ListView_GetSelectedCount(hWndList);
  65. #endif
  66. if ( !phnd )
  67.    return -1;
  68. *phnd = 0;
  69. if (cSelLBItems)
  70.    {
  71.    *phnd = GlobalAlloc(GMEM_FIXED, cSelLBItems * sizeof(int));
  72.    if ( !*phnd )
  73.       return -1;
  74.    *ppnSelItems = (int __far *)GlobalLock( *phnd );
  75.    if ( !*ppnSelItems )
  76.       {
  77.       GlobalFree( *phnd );
  78.       *phnd = 0;
  79.       return -1;
  80.       }
  81.    /* Get list of selected items. Return value is number of selected items */
  82. #ifndef WIN32
  83.    if (SendMessage(hWndList, LB_GETSELITEMS, cSelLBItems, (LONG)*ppnSelItems) != cSelLBItems)
  84.       {
  85.       GlobalUnlock(*phnd);
  86.       GlobalFree(*phnd);
  87.       *phnd = 0;
  88.       return -1;
  89.       }
  90. #else
  91.    j = ListView_GetItemCount(hWndList);
  92.    for (i = 0; i < j; i++)
  93.       {
  94.       lvi.mask      = LVIF_STATE;
  95.       lvi.stateMask = LVIS_SELECTED;
  96.       lvi.iItem     = i;
  97.       lvi.iSubItem  = 0;
  98.       ListView_GetItem(hWndList, &lvi);
  99.       if (lvi.state)
  100.          {
  101.          (*ppnSelItems)[k++] = i;
  102.          }
  103.       }
  104. #endif
  105.    }
  106.    return cSelLBItems;
  107. }
  108. #ifndef WIN32
  109. /* Re-select listbox contents from given list. The pnSelItems is a
  110.  * list containing the indices of those items selected in the listbox.
  111.  * This list was probably created by GetLBSelCount() above.
  112.  *
  113.  * This routine is only called from wndproc.c when switching between
  114.  * the long and short format. As the short format is not supported
  115.  * by the Win32 version, this routine is not necessary.
  116.  *
  117.  */
  118. void ReselectLB(HWND hListBox, int cSelLBItems, int __far *pnSelItems)
  119. {
  120. int i;
  121. for (i = 0; i < cSelLBItems; ++i)
  122.    {
  123.    SendMessage(hListBox, LB_SETSEL, TRUE, MAKELPARAM(pnSelItems[i],0));
  124.    }
  125. }
  126. #endif
  127. /* Action is called on double-clicking, or selecting one of the
  128.  * main action buttons. The action code is the action
  129.  * relative to the listbox or the button ID.
  130.  */
  131. void Action(HWND hWnd, WPARAM wActionCode)
  132. {
  133. HANDLE  hMem;
  134. int i;
  135. int iSelection;
  136. int cch;
  137. unsigned long dFreeSpace, dStrlen = 0;
  138. int cSelLBItems;
  139. int __far *pnSelItems;  /* pointer to list of selected items */
  140. #ifndef WIN32
  141. struct diskfree_t df;
  142. #else
  143. DWORD SectorsPerCluster, BytesPerSector, FreeClusters, Clusters;
  144. #endif
  145. HANDLE  hnd = 0;
  146. char **pszIndex;
  147. char *sz;
  148. LPSTR lpszT;
  149. #ifndef WIN32
  150. WORD wIndex = (WORD)(!uf.fFormatLong ? SHORT_FORM_FNAME_INX
  151.    : LONG_FORM_FNAME_INX);
  152. #endif
  153. cSelLBItems = CLBItemsGet(hWndList, &pnSelItems, &hnd);
  154. /* if no items were selected */
  155. if (cSelLBItems < 1)
  156.    return;
  157.     /* Note: this global value can be overriden in replace.c */
  158. uf.fDoAll = (lpDCL->noflag) ? 1 : 0;
  159. SetCapture(hWnd);
  160. hSaveCursor = SetCursor(hHourGlass);
  161. ShowCursor(TRUE);
  162.     /* If all the files are selected pass in no filenames */
  163.     /* since unzipping all files is the default */
  164. hMem = GlobalAlloc( GPTR, (PATH_MAX * 2));
  165. if ( !hMem )
  166.    goto done;
  167. lpszT = (LPSTR)GlobalLock( hMem );
  168. if ( !lpszT )
  169.    {
  170.    GlobalFree( hMem );
  171.    goto done;
  172.    }
  173. hFileList = GlobalAlloc( GPTR, FILENAME_BUF_SIZE);
  174. szFileList = (LPSTR)GlobalLock(hFileList);
  175. if (!szFileList)
  176.    {
  177.    GlobalFree(hFileList);
  178.    goto done;
  179.    }
  180. argc = ((WORD)cSelLBItems == cZippedFiles) ? 0 : 1;
  181. iSelection = 0;
  182. do
  183.    {
  184.    if ((argc) || (fUpdateEntries))
  185.       {
  186.       dSpaceToUse = 0;
  187.       pszIndex = (char **)szFileList;
  188.       cch = (sizeof(char *) * ((cSelLBItems > cchFilesMax-1 ) ? cchFilesMax :
  189.          cSelLBItems+1));
  190.       sz = szFileList + cch;
  191.       for (i=0; ((i+iSelection) < cSelLBItems) && (i < cchFilesMax-1); ++i)
  192.          {
  193. #ifndef WIN32
  194.          cch = (int)SendMessage(hWndList, LB_GETTEXTLEN, pnSelItems[i+iSelection], 0L);
  195.          if (cch != LB_ERR)
  196.             {
  197.             cch = (int)SendMessage(hWndList, LB_GETTEXT, pnSelItems[i+iSelection], (LONG)lpszT);
  198.             if ((cch != LB_ERR) && (cch > (int)wIndex))
  199.                {
  200.                /* Get uncompressed totals to pre-flight the extraction process
  201.                 * The pre-flight portion of this needs to be modified to occur
  202.                 * only during actual extraction to disk.
  203.                 */
  204.                strncpy(sz, lpszT, 9);
  205.                sz[9] = '';
  206.                dSpaceToUse += atol(sz);
  207.                lstrcpy(sz, lpszT+wIndex);
  208.                dStrlen += lstrlen(sz) + 1;
  209.                if (dStrlen > FILENAME_BUF_SIZE )
  210.                   {
  211.                   MessageBox(hWndMain, "Try selecting fewer files at a time",
  212.                   "Insufficient Memory", MB_OK |MB_SYSTEMMODAL|
  213.                   MB_ICONEXCLAMATION);
  214.                   goto done;
  215.                   }
  216.                pszIndex[i] = sz;
  217.                sz += (cch + 1 - wIndex);
  218.                }
  219.             else
  220.                {
  221.                break;
  222.                }
  223.             }
  224.          else
  225.             {
  226.             MessageBeep(1);
  227.             goto done;
  228.             }
  229. #else
  230.          /* Get uncompressed totals to pre-flight the extraction process
  231.           * The pre-flight portion of this needs to be modified to occur
  232.           * only during actual extraction to disk.
  233.           */
  234.          ListView_GetItemText(hWndList, pnSelItems[i+iSelection], 1, lpszT,
  235.                (PATH_MAX * 2));
  236.          lstrcpy(sz, lpszT);
  237.          dSpaceToUse += atol(sz);
  238.          /* Now we get the actual name */        
  239.          ListView_GetItemText(hWndList, pnSelItems[i+iSelection], 0, lpszT,
  240.                (PATH_MAX * 2));
  241.          lstrcpy(sz, lpszT+1);
  242.          dStrlen += lstrlen(sz) + 1;
  243.          if (dStrlen > FILENAME_BUF_SIZE )
  244.             {
  245.             MessageBox(hWndMain, "Try selecting fewer files at a time",
  246.             "Insufficient Memory", MB_OK |MB_SYSTEMMODAL|
  247.             MB_ICONEXCLAMATION);
  248.             goto done;
  249.             }
  250.          pszIndex[i] = sz;
  251.          sz += (strlen(lpszT) + 1);
  252. #endif
  253.          } /* end of for loop */
  254.       if (i == 0)
  255.          {
  256.          goto done;
  257.          }
  258.       argc = i;
  259.       pszIndex[i] = 0;
  260.       iSelection += i;
  261.       }
  262.    else
  263.       {
  264.       iSelection = cSelLBItems;
  265.       }
  266. switch (wActionCode)
  267.    {
  268. #ifdef WIN32
  269.    char tempChar;
  270. #endif
  271.    int Ok;
  272.    case 0:         /* extract button */
  273.          /* Get amount of free space on target drive */
  274. #ifndef WIN32
  275.           _dos_getdiskfree((toupper(szUnzipToDirName[0]) - 'A'+1), &df);
  276.           dFreeSpace = (long)df.avail_clusters *
  277.                        ((long)df.sectors_per_cluster *
  278.                        (long)df.bytes_per_sector);
  279. #else
  280.          tempChar = szUnzipToDirName[3];
  281.          szUnzipToDirName[3] = '';
  282.          GetDiskFreeSpace(szUnzipToDirName, &SectorsPerCluster, &BytesPerSector, &FreeClusters, &Clusters);
  283.          szUnzipToDirName[3] = tempChar;
  284.          dFreeSpace = (long)SectorsPerCluster * (long)BytesPerSector * (long)FreeClusters;
  285. #endif
  286.          if (dFreeSpace < dSpaceToUse)
  287.             {
  288.             sprintf(sz, "Free Disk Space = %lu bytesnUncompressed Files Total %lu bytesnContinue?n",
  289.                dFreeSpace, dSpaceToUse);
  290.             Ok = MessageBox(hWndMain, sz, "Insufficient Disk Space?", MB_OKCANCEL |
  291.                MB_ICONEXCLAMATION);
  292.             }
  293.          else
  294.             Ok = IDOK;
  295.          if (Ok != IDOK)
  296.             break;
  297.          lpDCL->ncflag = 0;
  298.          lpDCL->fQuiet = 0;
  299.          lpDCL->ntflag = 0;
  300.          lpDCL->nvflag = 0;
  301.          lpDCL->nUflag = lpDCL->ExtractOnlyNewer;
  302.          lpDCL->nzflag = 0;
  303.          lpDCL->ndflag = (int)(uf.fRecreateDirs ? 1 : 0);
  304.          lpDCL->noflag = uf.fDoAll;
  305.          lpDCL->naflag = (int)(uf.fTranslate ? 1 : 0);
  306.          lpDCL->lpszZipFN = lpumb->szFileName;
  307.          argv = (char **)szFileList;
  308.          if (!uf.fUnzipToZipDir && szUnzipToDirName[0])
  309.             {
  310.             lstrcpy(lpumb->szBuffer, szUnzipToDirName); /* OK to clobber szBuffer! */
  311.             }
  312.          hSaveCursor = SetCursor(hHourGlass);
  313.          ShowCursor(TRUE);
  314.          if (szUnzipToDirName[0])
  315.             lpDCL->lpszExtractDir = szUnzipToDirName;
  316.          else
  317.             lpDCL->lpszExtractDir = NULL;
  318.          Unz_SingleEntryPoint(argc, argv, 0, NULL, lpDCL, lpUserFunctions);
  319.          ShowCursor(FALSE);
  320.          SetCursor(hSaveCursor);
  321.          ShowCursor(TRUE);
  322.          if (!uf.fUnzipToZipDir && szUnzipToDirName[0])
  323.             {
  324.             lstrcpy(lpumb->szBuffer, lpumb->szDirName); /* OK to clobber szBuffer! */
  325.             }
  326.          break;
  327.         case 1:     /* display to message window */
  328.             {
  329.             int rc; /* return code */
  330.             bRealTimeMsgUpdate = FALSE;
  331.             lpDCL->fQuiet = 2; // Kill all messages
  332.             lpDCL->ncflag = 1;
  333.             lpDCL->ntflag = 0;
  334.             lpDCL->nvflag = 0;
  335.             lpDCL->nUflag = 1;
  336.             lpDCL->nzflag = 0;
  337.             lpDCL->ndflag = 0;
  338.             lpDCL->noflag = 0;
  339.             lpDCL->naflag = TRUE;
  340.             lpDCL->nZIflag = 0;
  341.             lpDCL->lpszZipFN = lpumb->szFileName;
  342.             argv = (char **)szFileList;
  343.             hSaveCursor = SetCursor(hHourGlass);
  344.             ShowCursor(TRUE);
  345.             lpDCL->lpszExtractDir = NULL;
  346.             rc = Unz_SingleEntryPoint(argc, argv, 0, NULL, lpDCL, lpUserFunctions);
  347.             if (rc == IZ_UNSUP)
  348.                BufferOut("%s is an encrypted file. Encryption not supported in this version",
  349.                          argv[0]);
  350.             SetWindowText(hWndStatic, argv[0]);
  351.             ShowCursor(FALSE);
  352.             SetCursor(hSaveCursor);
  353.             bRealTimeMsgUpdate = TRUE;
  354.             /* Following extraction to status window, user will want
  355.              * to scroll around, so put him/her in Edit/Status window.
  356.              */
  357.             if (rc != IZ_UNSUP)
  358.                PostMessage(hWnd, WM_COMMAND, IDM_SETFOCUS_ON_STATUS, 0L);
  359.             fSpool = FALSE;
  360.             }
  361.             break;
  362.         case 2:     /* test */
  363.             lpDCL->ncflag = 0;
  364.             lpDCL->fQuiet = 0;
  365.             lpDCL->ntflag = 1;
  366.             lpDCL->nvflag = 0;
  367.             lpDCL->nUflag = 1;
  368.             lpDCL->nzflag = 0;
  369.             lpDCL->ndflag = 0;
  370.             lpDCL->noflag = 0;
  371.             lpDCL->naflag = 0;
  372.             lpDCL->nZIflag = 0;
  373.             lpDCL->lpszZipFN = lpumb->szFileName;
  374.             argv = (char **)szFileList;
  375.             hSaveCursor = SetCursor(hHourGlass);
  376.             ShowCursor(TRUE);
  377.             lpDCL->lpszExtractDir = NULL;
  378.             Unz_SingleEntryPoint(argc, argv, 0, NULL, lpDCL, lpUserFunctions);
  379.             ShowCursor(FALSE);
  380.             SetCursor(hSaveCursor);
  381.             break;
  382.         case 3:     /* Get Zip Information */
  383.             {
  384.             lpDCL->fQuiet = 2;
  385.             lpDCL->ncflag = 0;
  386.             lpDCL->ntflag = 0;
  387.             lpDCL->nvflag = 0;
  388.             lpDCL->nUflag = 0;
  389.             lpDCL->nzflag = 0;
  390.             lpDCL->ndflag = 0;
  391.             lpDCL->noflag = 0;
  392.             lpDCL->naflag = 0;
  393.             lpDCL->nZIflag = 1;
  394.             lpDCL->lpszZipFN = lpumb->szFileName;
  395.             argv = (char **)szFileList;
  396.             hSaveCursor = SetCursor(hHourGlass);
  397.             ShowCursor(TRUE);
  398.             lpDCL->lpszExtractDir = NULL;
  399.             Unz_SingleEntryPoint(argc, argv, 0, NULL, lpDCL, lpUserFunctions);
  400.             ShowCursor(FALSE);
  401.             SetCursor(hSaveCursor);
  402.             lpDCL->nZIflag = 0;
  403.             break;
  404.             }
  405.         case 4:     /* Delete Archive Entries */
  406.             {
  407.             int retcode;
  408.             /* Save off zip flags */
  409.             BOOL fSuffix = ZpOpt.fSuffix;
  410.             BOOL fEncrypt = ZpOpt.fEncrypt;
  411.             BOOL fSystem = ZpOpt.fSystem;
  412.             BOOL fVolume = ZpOpt.fVolume;
  413.             BOOL fExtra = ZpOpt.fExtra;
  414.             BOOL fNoDirEntries = ZpOpt.fNoDirEntries;
  415.             BOOL fExcludeDate = ZpOpt.fExcludeDate;
  416.             BOOL fVerbose = ZpOpt.fVerbose;
  417.             BOOL fQuiet = ZpOpt.fQuiet;
  418.             BOOL fCRLF_LF = ZpOpt.fCRLF_LF;
  419.             BOOL fLF_CRLF = ZpOpt.fLF_CRLF;
  420.             BOOL fJunkDir = ZpOpt.fJunkDir;
  421.             BOOL fRecurse = ZpOpt.fRecurse;
  422.             BOOL fGrow = ZpOpt.fGrow;
  423.             BOOL fForce = ZpOpt.fForce;
  424.             BOOL fMove = ZpOpt.fMove;
  425.             BOOL fUpdate = ZpOpt.fUpdate;
  426.             BOOL fFreshen = ZpOpt.fFreshen;
  427.             BOOL fJunkSFX = ZpOpt.fJunkSFX;
  428.             BOOL fLatestTime = ZpOpt.fLatestTime;
  429.             BOOL fmakesfx = fMakeSFX;
  430.             BOOL fComment = ZpOpt.fComment;
  431.             BOOL fOffsets = ZpOpt.fOffsets;
  432.             /* Set all zip flags to false */
  433.             ZpOpt.fSuffix = FALSE;
  434.             ZpOpt.fEncrypt = FALSE;
  435.             ZpOpt.fSystem = FALSE;
  436.             ZpOpt.fVolume = FALSE;
  437.             ZpOpt.fExtra = FALSE;
  438.             ZpOpt.fNoDirEntries = FALSE;
  439.             ZpOpt.fExcludeDate = FALSE;
  440.             ZpOpt.fVerbose = FALSE;
  441.             ZpOpt.fQuiet = FALSE;
  442.             ZpOpt.fCRLF_LF = FALSE;
  443.             ZpOpt.fLF_CRLF = FALSE;
  444.             ZpOpt.fJunkDir = FALSE;
  445.             ZpOpt.fRecurse = FALSE;
  446.             ZpOpt.fGrow = FALSE;
  447.             ZpOpt.fForce = FALSE;
  448.             ZpOpt.fMove = FALSE;
  449.             ZpOpt.fUpdate = FALSE;
  450.             ZpOpt.fFreshen = FALSE;
  451.             ZpOpt.fJunkSFX = FALSE;
  452.             ZpOpt.fLatestTime = FALSE;
  453.             ZpOpt.fComment = FALSE;
  454.             ZpOpt.fOffsets = FALSE;
  455.             fMakeSFX = FALSE;
  456.             ZpOpt.fDeleteEntries = TRUE;
  457.             ZpZCL.argc = argc;
  458.             ZpZCL.lpszZipFN = lpumb->szFileName;
  459.             ZpZCL.FNV = (char **)szFileList;
  460.             retcode = MessageBox(hWndMain, "Are You Sure?",
  461.                "Deleting Archive Entries",
  462.                MB_OKCANCEL | MB_ICONEXCLAMATION);
  463.             if (retcode == IDOK)
  464.                {
  465.                BufferOut( "Deleting Files From Archive: %sn",
  466.                   lpumb->szFileName);
  467.                hSaveCursor = SetCursor(hHourGlass);
  468.                ShowCursor(TRUE);
  469.                ZipSetOptions(ZpOpt);
  470.                retcode = ZipArchive(ZpZCL);
  471.                ShowCursor(FALSE);
  472.                SetCursor(hSaveCursor);
  473.                if (retcode == ZE_OK)
  474.                   UpdateListBox();
  475.                }
  476.             else
  477.                BufferOut( "Deleting Files from archive canceledn");
  478.             /* Restore zip flags */
  479.             ZpOpt.fDeleteEntries = FALSE;
  480.             ZpOpt.fSuffix = fSuffix;
  481.             ZpOpt.fEncrypt = fEncrypt;
  482.             ZpOpt.fSystem = fSystem;
  483.             ZpOpt.fVolume = fVolume;
  484.             ZpOpt.fExtra = fExtra;
  485.             ZpOpt.fNoDirEntries = fNoDirEntries;
  486.             ZpOpt.fExcludeDate = fExcludeDate;
  487.             ZpOpt.fVerbose = fVerbose;
  488.             ZpOpt.fQuiet = fQuiet;
  489.             ZpOpt.fCRLF_LF = fCRLF_LF;
  490.             ZpOpt.fLF_CRLF = fLF_CRLF;
  491.             ZpOpt.fJunkDir = fJunkDir;
  492.             ZpOpt.fRecurse = fRecurse;
  493.             ZpOpt.fGrow = fGrow;
  494.             ZpOpt.fForce = fForce;
  495.             ZpOpt.fMove = fMove;
  496.             ZpOpt.fUpdate = fUpdate;
  497.             ZpOpt.fFreshen = fFreshen;
  498.             ZpOpt.fJunkSFX = fJunkSFX;
  499.             ZpOpt.fLatestTime = fLatestTime;
  500.             ZpOpt.fComment = fComment;
  501.             ZpOpt.fOffsets = fOffsets;
  502.             fMakeSFX = fmakesfx;
  503.             }
  504.             break;
  505.         case 5:     /* Update Archive Entries */
  506.             {
  507.             int retcode;
  508. #ifndef WIN32
  509.             FARPROC lpGetDirProc;
  510. #endif
  511.             dwCommDlgHelpId = HELPID_ZIP_UPDATE_ARCHIVE;
  512.             ZpZCL.argc = argc;
  513.             ZpZCL.lpszZipFN = lpumb->szFileName;
  514.             ZpZCL.FNV = (char **)szFileList;
  515.             retcode = MessageBox(hWndMain, "Are You Sure?",
  516.                "Update All Archive Entries",
  517.                MB_OKCANCEL | MB_ICONEXCLAMATION);
  518.             if (retcode == IDOK)
  519.                {
  520.                OPENFILENAME ofn;
  521.                char szTemp[256];
  522. #ifndef WIN32
  523.                _fmemset(&ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  524. #else
  525.                memset(&ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  526. #endif
  527.                WinAssert(hWnd);
  528.                szTemp[0] = '';
  529.                ofn.lStructSize = sizeof(OPENFILENAME);
  530.                ofn.hwndOwner = hWnd;
  531.                ofn.hInstance = hInst;
  532.                ofn.lpstrFilter = "All Files (*.*)*.*";
  533.                ofn.nFilterIndex = 1;
  534.                ofn.lpstrFile = szTemp;
  535.                ofn.nMaxFile = PATH_MAX;
  536.                ofn.lpstrFileTitle = NULL;
  537.                ofn.nMaxFileTitle = PATH_MAX; /* ignored ! */
  538.                ofn.lpstrTitle = (LPSTR)"Set Reference Directory";
  539.                ofn.lpstrInitialDir = NULL;
  540.                ofn.Flags = OFN_SHOWHELP | OFN_ENABLEHOOK | OFN_CREATEPROMPT |
  541.                   OFN_HIDEREADONLY|OFN_ENABLETEMPLATE;
  542. #ifndef WIN32
  543.                lpGetDirProc = MakeProcInstance((FARPROC)GetDirProc, hInst);
  544. #   ifndef MSC
  545.                (UINT CALLBACK *)ofn.lpfnHook = (UINT CALLBACK *)lpGetDirProc;
  546. #   else
  547.                ofn.lpfnHook = lpGetDirProc;
  548. #   endif
  549. #else
  550.                ofn.lpfnHook = (LPOFNHOOKPROC)GetDirProc;
  551. #endif
  552.                ofn.lpTemplateName = "GETDIR";   /* see getfiles.dlg   */
  553.                if ((GetOpenFileName(&ofn)) &&
  554.                   (szRefDir[0] != ''))
  555.                   {
  556.                   BufferOut( "Updating Files in Archive: %sn",
  557.                      lpumb->szFileName);
  558.                   hSaveCursor = SetCursor(hHourGlass);
  559.                   ShowCursor(TRUE);
  560.                   ZipSetOptions(ZpOpt);
  561.                   retcode = ZipArchive(ZpZCL);
  562.                   ShowCursor(FALSE);
  563.                   SetCursor(hSaveCursor);
  564.                   if (retcode == ZE_OK)
  565.                      UpdateListBox();
  566.                   }
  567.                }
  568.             else
  569.                BufferOut( "Updating archive canceledn");
  570.             break;
  571.             }
  572.           }
  573.     } while (iSelection < cSelLBItems);
  574.     /* march through list box checking what's selected
  575.      * and what is not.
  576.      */
  577. done:
  578.     if ( hMem )
  579.        {
  580.        GlobalUnlock( hMem );
  581.        GlobalFree( hMem );
  582.        }
  583.     if (hFileList)
  584.        {
  585.        GlobalUnlock(hFileList);
  586.        GlobalFree(hFileList);
  587.        }
  588.     GlobalUnlock(hnd);
  589.     GlobalFree(hnd);
  590.     ShowCursor(FALSE);
  591.     SetCursor(hSaveCursor);
  592.     ReleaseCapture();
  593.     SoundAfter();      /* play sound afterward if requested */
  594.     if (!uf.fIconSwitched)  /* if haven't already, switch icons */
  595.     {
  596.         HANDLE hIcon;
  597.         hIcon = LoadIcon(hInst,"unzipped"); /* load final icon   */
  598.         WinAssert(hIcon);
  599. #ifndef WIN32
  600.         SetClassWord(hWndMain, GCW_HICON, hIcon);
  601. #else
  602.         SetClassLong(hWndMain, GCL_HICON, (LONG)hIcon);
  603. #endif
  604.         uf.fIconSwitched = TRUE;    /* flag that we've switched it  */
  605.     }
  606. }
  607. /* Display the archive comment using the Info-ZIP engine. */
  608. void DisplayComment(HWND hWnd)
  609. {
  610.    SetCapture(hWnd);
  611.    hSaveCursor = SetCursor(hHourGlass);
  612.    ShowCursor(TRUE);
  613.    bRealTimeMsgUpdate = FALSE;
  614.    /* Called here when showing zipfile comment */
  615.    lpDCL->ncflag = 0;
  616.    lpDCL->fQuiet = 0;
  617.    lpDCL->ntflag = 0;
  618.    lpDCL->nvflag = 0;
  619.    lpDCL->nUflag = 1;
  620.    lpDCL->nzflag = 1;
  621.    lpDCL->ndflag = 0;
  622.    lpDCL->noflag = 0;
  623.    lpDCL->naflag = 0;
  624.    argc   = 0;
  625.    lpDCL->lpszZipFN = lpumb->szFileName;
  626.    argv = NULL;
  627.    lpDCL->lpszExtractDir = NULL;
  628.    Unz_SingleEntryPoint(argc, argv, 0, NULL, lpDCL, lpUserFunctions);
  629.    ShowCursor(FALSE);
  630.    SetCursor(hSaveCursor);
  631.    bRealTimeMsgUpdate = TRUE;
  632.    ReleaseCapture();
  633.    SoundAfter();      /* play sound during if requested         */
  634. }