Borneq

UnACE.cpp

Sep 5th, 2013
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <jni.h>
  2. #include <Windows.h>
  3. #include <string.h>
  4. #include "unace/UnACE.h"
  5. #include "unace/CallbackProc.h"
  6. #include "throwJNI.h"
  7. #include "net_sf_junace_UnACE.h"
  8.  
  9. #define   FILELISTSIZE   32768  // pretty much for this this example:
  10.                                 // only the commandline can be used to
  11.                                 // specify files..
  12. #define   COMMENTBUFSIZE 8192   // comments may be up to 32k in size
  13.                                 // increase it if you want to put that
  14.                                 // large comments to archives, or if
  15.                                 // you want to receive all of these large
  16.                                 // comments (ACE_COMMENT_SMALLBUF returned
  17.                                 // if comment does not fit into buffer)
  18.  
  19. HINSTANCE AceDllInstance;
  20. CHAR      FileList[FILELISTSIZE];
  21. CHAR      CommentBuf[COMMENTBUFSIZE];
  22.  
  23. INT (__stdcall *ACEInitDllProc)(pACEInitDllStruc DllData);
  24. INT (__stdcall *ACEReadArchiveDataProc)(LPSTR ArchiveName, pACEReadArchiveDataStruc ArchiveData);
  25. INT (__stdcall *ACEListProc)(LPSTR ArchiveName, pACEListStruc List);
  26. INT (__stdcall *ACETestProc)(LPSTR ArchiveName, pACETestStruc Test);
  27. INT (__stdcall *ACEExtractProc)(LPSTR ArchiveName, pACEExtractStruc Extract);
  28.  
  29.  
  30. INT     CallAceInitDll(void)
  31. {
  32. tACEInitDllStruc
  33.           DllData;
  34.  
  35.   memset(&DllData, 0, sizeof(DllData));   // set all fields to zero
  36.  
  37.   DllData.GlobalData.MaxArchiveTestBytes = 0x2ffFF; // search for archive
  38.                                                     // header in first 256k
  39.                                                     // of file
  40.   DllData.GlobalData.MaxFileBufSize      = 0x2ffFF; // read/write buffer size
  41.                                                     // is 256k
  42.  
  43.   DllData.GlobalData.Comment.BufSize     = sizeof(CommentBuf);
  44.   DllData.GlobalData.Comment.Buf         = CommentBuf; // set comment bufffer
  45.                                                        // to receive comments
  46.                                                        // of archive and/or
  47.                                                        // set comments
  48.  
  49.   DllData.GlobalData.TempDir             = "C:\\TEMP"; // set temp dir
  50.  
  51.   // set callback function pointers
  52.   DllData.GlobalData.InfoCallbackProc    = InfoProc;
  53.   DllData.GlobalData.ErrorCallbackProc   = ErrorProc;
  54.   DllData.GlobalData.RequestCallbackProc = RequestProc;
  55.   DllData.GlobalData.StateCallbackProc   = StateProc;
  56.  
  57.   return ACEInitDllProc(&DllData);
  58. }
  59.  
  60. JNIEXPORT void JNICALL Java_net_sf_junace_UnACE_nativeACEList
  61.   (JNIEnv *env, jobject jObj1, jstring archiveName, jobject jObj2)
  62. {
  63.     tACEListStruc List;
  64.     LPSTR str;
  65.     str = (LPSTR)env->GetStringUTFChars(archiveName, NULL);
  66.     if (str == NULL) {
  67.         return; // already thrown OutOfMemoryError
  68.     }
  69.     memset(&List, 0, sizeof(List));     // set all fields to zero
  70.  
  71.     List.Files.SourceDir   = "";        // archive main directory is
  72.                                       // base directory for FileList
  73.     List.Files.FileList    = FileList;  // set FileList
  74.     List.Files.ExcludeList = "";        // no files to exclude
  75.     List.Files.FullMatch   = 0;         // also list files partially matching
  76.                                       // (for instance: list DIR1\TEST.DAT
  77.                                       //  if FileList specifies TEST.DAT)
  78.  
  79.     ACEListProc(str, &List);
  80.     env->ReleaseStringUTFChars(archiveName, str); // enable releasing by Garbage Collector
  81. }
  82.  
  83. JNIEXPORT jboolean JNICALL Java_net_sf_junace_UnACE_LoadAceDll
  84.   (JNIEnv *env, jobject)
  85. {
  86.     AceDllInstance = LoadLibrary(L"UnAceV2.Dll");
  87.     if (AceDllInstance) {
  88.          if (!(ACEInitDllProc          = (INT (__stdcall *)(pACEInitDllStruc DllData))
  89.               GetProcAddress(AceDllInstance, "ACEInitDll"))
  90.         || !(ACEReadArchiveDataProc    = (INT (__stdcall *)(LPSTR ArchiveName, pACEReadArchiveDataStruc ArchiveData))
  91.               GetProcAddress(AceDllInstance, "ACEReadArchiveData"))
  92.         || !(ACEListProc               = (INT (__stdcall *)(LPSTR ArchiveName, pACEListStruc List))
  93.               GetProcAddress(AceDllInstance, "ACEList"))
  94.         || !(ACETestProc               = (INT (__stdcall *)(LPSTR ArchiveName, pACETestStruc Test))
  95.               GetProcAddress(AceDllInstance, "ACETest"))
  96.         || !(ACEExtractProc            =  (INT (__stdcall *)(LPSTR ArchiveName, pACEExtractStruc Extract))
  97.               GetProcAddress(AceDllInstance, "ACEExtract")))
  98.          {
  99.             FreeLibrary(AceDllInstance);
  100.             throwUnsatisfiedLinkError(env, "Could not find function in UnAceV2.Dll!");
  101.             return FALSE;
  102.          }
  103.          CallAceInitDll();         
  104.     }
  105.     else
  106.         throwUnsatisfiedLinkError(env, "Can't load UnAceV2.Dll");
  107.     return AceDllInstance != NULL;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment