home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 May / PCO_5_97.ISO / FilesBBS / WIN95 / WINRAR.ARJ / Example / UnRDLL.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-02  |  5.4 KB  |  248 lines

  1. #define STRICT
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include "unrar.h"
  6.  
  7. enum { EXTRACT, TEST, PRINT };
  8.  
  9. void ExtractArchive(char *ArcName,int Mode);
  10. void ListArchive(char *ArcName);
  11. void ShowComment(char *CmtBuf);
  12. void OutHelp(void);
  13. void OutOpenArchiveError(int Error,char *ArcName);
  14. void OutProcessFileError(int Error);
  15. int ChangeVolProc(char *ArcName,int Mode);
  16. int ProcessDataProc(unsigned char *Addr,int Size);
  17.  
  18. main(int Argc, char *Argv[])
  19. {
  20.   if (Argc!=3)
  21.   {
  22.     OutHelp();
  23.     return(0);
  24.   }
  25.  
  26.   switch(toupper(Argv[1][0]))
  27.   {
  28.     case 'X':
  29.       ExtractArchive(Argv[2],EXTRACT);
  30.       break;
  31.     case 'T':
  32.       ExtractArchive(Argv[2],TEST);
  33.       break;
  34.     case 'P':
  35.       ExtractArchive(Argv[2],PRINT);
  36.       break;
  37.     case 'L':
  38.       ListArchive(Argv[2]);
  39.       break;
  40.     default:
  41.       OutHelp();
  42.       return(0);
  43.   }
  44.  
  45.   return(0);
  46. }
  47.  
  48.  
  49. void ExtractArchive(char *ArcName,int Mode)
  50. {
  51.   HANDLE hArcData;
  52.   int RHCode,PFCode;
  53.   char CmtBuf[16384];
  54.   struct RARHeaderData HeaderData;
  55.   struct RAROpenArchiveData OpenArchiveData;
  56.  
  57.   OpenArchiveData.ArcName=ArcName;
  58.   OpenArchiveData.CmtBuf=CmtBuf;
  59.   OpenArchiveData.CmtBufSize=sizeof(CmtBuf);
  60.   OpenArchiveData.OpenMode=RAR_OM_EXTRACT;
  61.   hArcData=RAROpenArchive(&OpenArchiveData);
  62.  
  63.   if (OpenArchiveData.OpenResult!=0)
  64.   {
  65.     OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
  66.     return;
  67.   }
  68.  
  69.   if (OpenArchiveData.CmtState==1)
  70.     ShowComment(CmtBuf);
  71.  
  72.   RARSetChangeVolProc(hArcData,ChangeVolProc);
  73.  
  74.   if (Mode==PRINT)
  75.     RARSetProcessDataProc(hArcData,ProcessDataProc);
  76.  
  77.   HeaderData.CmtBuf=NULL;
  78.  
  79.   while ((RHCode=RARReadHeader(hArcData,&HeaderData))==0)
  80.   {
  81.     switch(Mode)
  82.     {
  83.       case EXTRACT:
  84.         printf("\nExtracting %-45s",HeaderData.FileName);
  85.         break;
  86.       case TEST:
  87.         printf("\nTesting %-45s",HeaderData.FileName);
  88.         break;
  89.       case PRINT:
  90.         printf("\nPrinting %-45s\n",HeaderData.FileName);
  91.         break;
  92.     }
  93.     PFCode=RARProcessFile(hArcData,(Mode==EXTRACT) ? RAR_EXTRACT:RAR_TEST,
  94.                           NULL,NULL);
  95.     if (PFCode==0)
  96.       printf(" Ok");
  97.     else
  98.     {
  99.       OutProcessFileError(PFCode);
  100.       break;
  101.     }
  102.   }
  103.  
  104.   if (RHCode==ERAR_BAD_DATA)
  105.     printf("\nFile header broken");
  106.  
  107.   RARCloseArchive(hArcData);
  108. }
  109.  
  110.  
  111. void ListArchive(char *ArcName)
  112. {
  113.   HANDLE hArcData;
  114.   int RHCode,PFCode;
  115.   char CmtBuf[16384];
  116.   struct RARHeaderData HeaderData;
  117.   struct RAROpenArchiveData OpenArchiveData;
  118.  
  119.   OpenArchiveData.ArcName=ArcName;
  120.   OpenArchiveData.CmtBuf=CmtBuf;
  121.   OpenArchiveData.CmtBufSize=sizeof(CmtBuf);
  122.   OpenArchiveData.OpenMode=RAR_OM_LIST;
  123.   hArcData=RAROpenArchive(&OpenArchiveData);
  124.  
  125.   if (OpenArchiveData.OpenResult!=0)
  126.   {
  127.     OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
  128.     return;
  129.   }
  130.  
  131.   if (OpenArchiveData.CmtState==1)
  132.     ShowComment(CmtBuf);
  133.  
  134.   RARSetChangeVolProc(hArcData,ChangeVolProc);
  135.  
  136.   HeaderData.CmtBuf=CmtBuf;
  137.   HeaderData.CmtBufSize=sizeof(CmtBuf);
  138.  
  139.   printf("\nFile                       Size");
  140.   printf("\n-------------------------------");
  141.   while ((RHCode=RARReadHeader(hArcData,&HeaderData))==0)
  142.   {
  143.     printf("\n%-20s %10d ",HeaderData.FileName,HeaderData.UnpSize);
  144.     if (HeaderData.CmtState==1)
  145.       ShowComment(CmtBuf);
  146.     if ((PFCode=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL))!=0)
  147.     {
  148.       OutProcessFileError(PFCode);
  149.       break;
  150.     }
  151.   }
  152.  
  153.   if (RHCode==ERAR_BAD_DATA)
  154.     printf("\nFile header broken");
  155.  
  156.   RARCloseArchive(hArcData);
  157. }
  158.  
  159.  
  160. void ShowComment(char *CmtBuf)
  161. {
  162.   printf("\nComment:\n%s\n",CmtBuf);
  163. }
  164.  
  165.  
  166. void OutHelp(void)
  167. {
  168.   printf("\nUNRDLL.   This is a simple example of UNRAR.DLL usage\n");
  169.   printf("\nSyntax:\n");
  170.   printf("\nUNRDLL X <Archive>     extract archive contents");
  171.   printf("\nUNRDLL T <Archive>     test archive contents");
  172.   printf("\nUNRDLL P <Archive>     print archive contents to stdout");
  173.   printf("\nUNRDLL L <Archive>     view archive contents\n");
  174. }
  175.  
  176.  
  177. void OutOpenArchiveError(int Error,char *ArcName)
  178. {
  179.   switch(Error)
  180.   {
  181.     case ERAR_NO_MEMORY:
  182.       printf("\nNot enough memory");
  183.       break;
  184.     case ERAR_EOPEN:
  185.       printf("\nCannot open %s",ArcName);
  186.       break;
  187.     case ERAR_BAD_ARCHIVE:
  188.       printf("\n%s is not RAR archive",ArcName);
  189.       break;
  190.     case ERAR_BAD_DATA:
  191.       printf("\n%s: archive header broken",ArcName);
  192.       break;
  193.   }
  194. }
  195.  
  196. void OutProcessFileError(int Error)
  197. {
  198.   switch(Error)
  199.   {
  200.     case ERAR_UNKNOWN_FORMAT:
  201.       printf("Unknown archive format");
  202.       break;
  203.     case ERAR_BAD_ARCHIVE:
  204.       printf("Bad volume");
  205.       break;
  206.     case ERAR_ECREATE:
  207.       printf("File create error");
  208.       break;
  209.     case ERAR_EOPEN:
  210.       printf("Volume open error");
  211.       break;
  212.     case ERAR_ECLOSE:
  213.       printf("File close error");
  214.       break;
  215.     case ERAR_EREAD:
  216.       printf("Read error");
  217.       break;
  218.     case ERAR_EWRITE:
  219.       printf("Write error");
  220.       break;
  221.     case ERAR_BAD_DATA:
  222.       printf("CRC error");
  223.       break;
  224.   }
  225. }
  226.  
  227.  
  228. int ChangeVolProc(char *ArcName,int Mode)
  229. {
  230.   int Ch;
  231.   if (Mode==RAR_VOL_ASK)
  232.   {
  233.     printf("\nInsert disk with %s and press 'Enter' or enter 'Q' to exit ",ArcName);
  234.     Ch=getchar();
  235.     return(toupper(Ch)!='Q');
  236.   }
  237.   return(1);
  238. }
  239.  
  240.  
  241. int ProcessDataProc(unsigned char *Addr,int Size)
  242. {
  243.   fflush(stdout);
  244.   fwrite(Addr,1,Size,stdout);
  245.   fflush(stdout);
  246.   return(1);
  247. }
  248.