Advertisement
Guest User

unrar

a guest
Aug 11th, 2014
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <Windows.h>
  5. #include "unrar.h"
  6.  
  7. enum { EXTRACT, TEST, PRINT, LIST };
  8.  
  9. void ExtractArchive(char* ArcName, int Mode);
  10. void ListArchive(char* ArcName);
  11. void ShowComment(char* CmtBuf);
  12. void OutHelp(void);
  13.  
  14. enum ERR_TYPE { ERR_OPEN, ERR_READ, ERR_PROCESS };
  15. void OutError(int Error, char* ArcName, int ErrType);
  16.  
  17. void ShowArcInfo(unsigned int Flags, char* ArcName);
  18. void OutProcessFileError(int Error);
  19. int CALLBACK CallbackProc(UINT msg, LPARAM UserData, LPARAM P1, LPARAM P2);
  20.  
  21.  
  22.  
  23. int main(int nArgs, char** szArgs)
  24. {
  25.  
  26.     char* szPath = "I:\\Projekte\\Visual_Studio\\Unrar\\Beispiel.rar";
  27.     ExtractArchive(szPath, EXTRACT);
  28.  
  29.     return 0;//EXIT_SUCCESS
  30. }
  31.  
  32.  
  33. void ExtractArchive(char* ArcName, int Mode)
  34. {
  35.     HANDLE hArcData;
  36.     int RHCode, PFCode;
  37.     char CmtBuf[16384];
  38.     struct RARHeaderData HeaderData;
  39.     struct RAROpenArchiveDataEx OpenArchiveData;
  40.  
  41.     memset(&OpenArchiveData, 0, sizeof(OpenArchiveData));
  42.     OpenArchiveData.ArcName = ArcName;
  43.     OpenArchiveData.CmtBuf = CmtBuf;
  44.     OpenArchiveData.CmtBufSize = sizeof(CmtBuf);
  45.     OpenArchiveData.OpenMode = RAR_OM_EXTRACT;
  46.     OpenArchiveData.Callback = CallbackProc;
  47.     OpenArchiveData.UserData = Mode;
  48.     hArcData = RAROpenArchiveEx(&OpenArchiveData);
  49.  
  50.     if (OpenArchiveData.OpenResult != 0)
  51.     {
  52.         OutError(OpenArchiveData.OpenResult, ArcName, ERR_OPEN);
  53.         return;
  54.     }
  55.  
  56.     ShowArcInfo(OpenArchiveData.Flags, ArcName);
  57.  
  58.     if (OpenArchiveData.CmtState == 1)
  59.     { ShowComment(CmtBuf); }
  60.  
  61.     // Obsolete, use RAROpenArchiveDataEx callback fields above.
  62.     // RARSetCallback(hArcData,CallbackProc,(LPARAM)&Mode);
  63.  
  64.     HeaderData.CmtBuf = NULL;
  65.     memset(&OpenArchiveData.Reserved, 0, sizeof(OpenArchiveData.Reserved));
  66.  
  67.     while ((RHCode = RARReadHeader(hArcData, &HeaderData)) == 0)
  68.     {
  69.         switch (Mode)
  70.         {
  71.             case EXTRACT:
  72.                 printf("\nExtracting %-45s", HeaderData.FileName);
  73.                 break;
  74.             case TEST:
  75.                 printf("\nTesting %-45s", HeaderData.FileName);
  76.                 break;
  77.             case PRINT:
  78.                 printf("\nPrinting %-45s\n", HeaderData.FileName);
  79.                 break;
  80.         }
  81.         PFCode = RARProcessFile(hArcData, (Mode == EXTRACT) ? RAR_EXTRACT : RAR_TEST,
  82.                                 NULL, NULL);
  83.         if (PFCode == 0)
  84.         { printf(" OK"); }
  85.         else
  86.         {
  87.             OutError(PFCode, ArcName, ERR_PROCESS);
  88.             break;
  89.         }
  90.     }
  91.  
  92.     OutError(RHCode, ArcName, ERR_READ);
  93.  
  94.     RARCloseArchive(hArcData);
  95. }
  96.  
  97.  
  98. void ListArchive(char* ArcName)
  99. {
  100.     HANDLE hArcData;
  101.     int RHCode, PFCode;
  102.     char CmtBuf[16384];
  103.     struct RARHeaderDataEx HeaderData;
  104.     struct RAROpenArchiveDataEx OpenArchiveData;
  105.  
  106.     memset(&OpenArchiveData, 0, sizeof(OpenArchiveData));
  107.     OpenArchiveData.ArcName = ArcName;
  108.     OpenArchiveData.CmtBuf = CmtBuf;
  109.     OpenArchiveData.CmtBufSize = sizeof(CmtBuf);
  110.     OpenArchiveData.OpenMode = RAR_OM_LIST;
  111.     OpenArchiveData.Callback = CallbackProc;
  112.     OpenArchiveData.UserData = LIST;
  113.     hArcData = RAROpenArchiveEx(&OpenArchiveData);
  114.  
  115.     if (OpenArchiveData.OpenResult != 0)
  116.     {
  117.         OutError(OpenArchiveData.OpenResult, ArcName, ERR_OPEN);
  118.         return;
  119.     }
  120.  
  121.     ShowArcInfo(OpenArchiveData.Flags, ArcName);
  122.  
  123.     if (OpenArchiveData.CmtState == 1)
  124.     { ShowComment(CmtBuf); }
  125.  
  126.     // Obsolete, use RAROpenArchiveDataEx callback fields above.
  127.     // RARSetCallback(hArcData,CallbackProc,0);
  128.  
  129.     HeaderData.CmtBuf = NULL;
  130.     memset(&OpenArchiveData.Reserved, 0, sizeof(OpenArchiveData.Reserved));
  131.  
  132.     printf("\nFile                       Size");
  133.     printf("\n-------------------------------");
  134.     while ((RHCode = RARReadHeaderEx(hArcData, &HeaderData)) == 0)
  135.     {
  136.         __int64 UnpSize = HeaderData.UnpSize + (((__int64)HeaderData.UnpSizeHigh) << 32);
  137.         printf("\n%-20s %10Ld ", HeaderData.FileName, UnpSize);
  138.         if ((PFCode = RARProcessFile(hArcData, RAR_SKIP, NULL, NULL)) != 0)
  139.         {
  140.             OutError(PFCode, ArcName, ERR_PROCESS);
  141.             break;
  142.         }
  143.     }
  144.  
  145.     OutError(RHCode, ArcName, ERR_READ);
  146.  
  147.     RARCloseArchive(hArcData);
  148. }
  149.  
  150.  
  151. void ShowComment(char* CmtBuf)
  152. {
  153.     printf("\nComment:\n%s\n", CmtBuf);
  154. }
  155.  
  156.  
  157. void OutHelp(void)
  158. {
  159.     printf("\nUNRDLL.   This is a simple example of UNRAR.DLL usage\n");
  160.     printf("\nSyntax:\n");
  161.     printf("\nUNRDLL X <Archive>     extract archive contents");
  162.     printf("\nUNRDLL T <Archive>     test archive contents");
  163.     printf("\nUNRDLL P <Archive>     print archive contents to stdout");
  164.     printf("\nUNRDLL L <Archive>     view archive contents\n");
  165. }
  166.  
  167.  
  168. void OutError(int Error, char* ArcName, int ErrType)
  169. {
  170.     switch (Error)
  171.     {
  172.         case ERAR_NO_MEMORY:
  173.             printf("\nNot enough memory");
  174.             break;
  175.         case ERAR_BAD_DATA:
  176.             printf("\n%s: archive header or data are damaged", ArcName);
  177.             break;
  178.         case ERAR_BAD_ARCHIVE:
  179.             printf("\n%s is not RAR archive", ArcName);
  180.             break;
  181.         case ERAR_UNKNOWN_FORMAT:
  182.             printf("Unknown archive format");
  183.             break;
  184.         case ERAR_EOPEN:
  185.             if (ErrType == ERR_PROCESS) // Returned by RARProcessFile.
  186.             { printf("Volume open error"); }
  187.             else
  188.             { printf("\nCannot open %s", ArcName); }
  189.             break;
  190.         case ERAR_ECREATE:
  191.             printf("File create error");
  192.             break;
  193.         case ERAR_ECLOSE:
  194.             printf("File close error");
  195.             break;
  196.         case ERAR_EREAD:
  197.             printf("Read error");
  198.             break;
  199.         case ERAR_EWRITE:
  200.             printf("Write error");
  201.             break;
  202.         case ERAR_SMALL_BUF:
  203.             printf("Buffer for archive comment is too small, comment truncated");
  204.             break;
  205.         case ERAR_UNKNOWN:
  206.             printf("Unknown error");
  207.             break;
  208.         case ERAR_MISSING_PASSWORD:
  209.             printf("Password for encrypted file or header is not specified");
  210.             break;
  211.         case ERAR_EREFERENCE:
  212.             printf("Cannot open file source for reference record");
  213.             break;
  214.         case ERAR_BAD_PASSWORD:
  215.             printf("Wrong password is specified");
  216.             break;
  217.     }
  218. }
  219.  
  220.  
  221. void ShowArcInfo(unsigned int Flags, char* ArcName)
  222. {
  223.     printf("\nArchive %s\n", ArcName);
  224.     printf("\nVolume:\t\t%s", (Flags & 1) ? "yes" : "no");
  225.     printf("\nComment:\t%s", (Flags & 2) ? "yes" : "no");
  226.     printf("\nLocked:\t\t%s", (Flags & 4) ? "yes" : "no");
  227.     printf("\nSolid:\t\t%s", (Flags & 8) ? "yes" : "no");
  228.     printf("\nNew naming:\t%s", (Flags & 16) ? "yes" : "no");
  229.     printf("\nRecovery:\t%s", (Flags & 64) ? "yes" : "no");
  230.     printf("\nEncr.headers:\t%s", (Flags & 128) ? "yes" : "no");
  231.     printf("\nFirst volume:\t%s", (Flags & 256) ? "yes" : "no or older than 3.0");
  232.     printf("\n---------------------------\n");
  233. }
  234.  
  235.  
  236. int CALLBACK CallbackProc(UINT msg, LPARAM UserData, LPARAM P1, LPARAM P2)
  237. {
  238.     switch (msg)
  239.     {
  240.         case UCM_CHANGEVOLUMEW:
  241.             if (P2 == RAR_VOL_ASK)
  242.             {
  243.                 printf("\n\nVolume %S is required\nPossible options:\n", (wchar_t*)P1);
  244.                 printf("\nEnter - try again");
  245.                 printf("\n'R'   - specify a new volume name");
  246.                 printf("\n'Q'   - quit");
  247.                 printf("\nEnter your choice: ");
  248.                 switch (toupper(getchar()))
  249.                 {
  250.                     case 'Q':
  251.                         return(-1);
  252.                     case 'R':
  253.                     {
  254.                         wchar_t* eol;
  255.                         printf("\nEnter new name: ");
  256.                         fflush(stdin);
  257.  
  258.                         // fgetws may fail to read non-English characters from stdin
  259.                         // in some compilers. In this case use something more
  260.                         // appropriate for Unicode input.
  261.                         fgetws((wchar_t*)P1, MAX_PATH, stdin);
  262.  
  263.                         eol = wcspbrk((wchar_t*)P1, L"\r\n");
  264.                         if (eol != NULL)
  265.                         { *eol = 0; }
  266.                     }
  267.                     return(1);
  268.                     default:
  269.                         return(1);
  270.                 }
  271.             }
  272.             if (P2 == RAR_VOL_NOTIFY)
  273.             { printf("\n  ... volume %S\n", (wchar_t*)P1); }
  274.             return(1);
  275.         case UCM_PROCESSDATA:
  276.             if (UserData == PRINT)
  277.             {
  278.                 fflush(stdout);
  279.                 fwrite((char*)P1, 1, P2, stdout);
  280.                 fflush(stdout);
  281.             }
  282.             return(1);
  283.         case UCM_NEEDPASSWORDW:
  284.         {
  285.             wchar_t* eol;
  286.             printf("\nPassword required: ");
  287.  
  288.             // fgetws may fail to read non-English characters from stdin
  289.             // in some compilers. In this case use something more appropriate
  290.             // for Unicode input.
  291.             fgetws((wchar_t*)P1, P2, stdin);
  292.  
  293.             eol = wcspbrk((wchar_t*)P1, L"\r\n");
  294.             if (eol != NULL)
  295.             { *eol = 0; }
  296.         }
  297.         return(1);
  298.     }
  299.     return(0);
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement