void YKZip::Extra(const YKString& srcFile, const YKString& desPath, const YK_CHAR* passWord /* = "" */) { #if YK_OS == YK_OS_WINDOWS_NT setlocale(LC_ALL, NULL); HANDLE hArcData; int RHCode,PFCode; char CmtBuf[16384]; struct RARHeaderDataEx HeaderData; struct RAROpenArchiveDataEx OpenArchiveData; memset(&HeaderData,0,sizeof(HeaderData)); memset(&OpenArchiveData,0,sizeof(OpenArchiveData)); YKBuffer<YK_WCHAR> buffSrc(srcFile.size()+1); std::wcscpy(buffSrc.Begin(), srcFile.c_str()); YKBuffer<YK_WCHAR> buffDes(desPath.size()+1); std::wcscpy(buffDes.Begin(), desPath.c_str()); OpenArchiveData.ArcNameW = buffSrc.Begin(); OpenArchiveData.CmtBuf=CmtBuf; OpenArchiveData.CmtBufSize=sizeof(CmtBuf); OpenArchiveData.OpenMode=RAR_OM_EXTRACT; OpenArchiveData.Callback=YK_NULL; OpenArchiveData.UserData=0; hArcData = RAROpenArchiveEx(&OpenArchiveData); if (OpenArchiveData.OpenResult!=0) return; RARSetPassword(hArcData, const_cast<YK_CHAR*>(passWord)); while ((RHCode=RARReadHeaderEx(hArcData,&HeaderData))==0) { PFCode = RARProcessFileW(hArcData,RAR_EXTRACT, buffDes.Begin(), NULL); } RARCloseArchive(hArcData); #endif // YKString strExtra = g_Application.GetCurModulePath(); // strExtra.Append(L"HaoZip\\HaoZipC.exe x ").Append(srcFile).Append(L" -ao -y -o").Append(desPath); // strExtra.Append(L" -p").Append(L"42F7AA9A-67E0-4CC7-9526-B2E8B358F179"); // system(strExtra.ToString().c_str()); // return; // HZIP hz = OpenZip(srcFile.c_str(), passWord); // ZIPENTRY ze; // GetZipItem(hz,-1,&ze); // int num = ze.index; // for (int i = 0; i < num; ++i) // { // GetZipItem(hz, i, &ze); // UnzipItem(hz,i, (desPath + ze.name).c_str()); // } // // CloseZip(hz); }
int _tmain(int argc, _TCHAR* argv[]) { HANDLE rar_handle = NULL; //std::wstring fn_rar = L"E:\\-=eMule=-\\1140746814_39741.rar"; //std::wstring fn_rar = L"E:\\-=eMule=-\\Bride.Flight.2008.Bluray.720p.AC3.x264-CHD_ÐÂÄﺽ°à\\B2_ÐÂÄﺽ°à.part1.rar"; //std::wstring fn_rar = L"D:\\xxxx.part1.rar"; std::wstring fn_rar = L"E:\\-=eMule=-\\Overheard.2009.REPACK.CN.DVDRip.Xvid-XTM\\sample\\xtm-overheard.repack-sample_stored.rar"; //std::wstring fn_rar = L"E:\\-=eMule=-\\Overheard.2009.REPACK.CN.DVDRip.Xvid-XTM\\sample\\xtm-overheard.repack-sample_s.part1.rar"; std::wstring tmp_dir = L"C:\\Temp\\"; struct RAROpenArchiveDataEx ArchiveDataEx; memset(&ArchiveDataEx, 0, sizeof(ArchiveDataEx)); ArchiveDataEx.ArcNameW = (wchar_t*)fn_rar.c_str(); //ArchiveDataEx.ArcName = "E:\\-=eMule=-\\1140746814_39741.rar"; ArchiveDataEx.OpenMode = RAR_OM_EXTRACT; ArchiveDataEx.CmtBuf = 0; rar_handle = RAROpenArchiveEx(&ArchiveDataEx); const long buffsize = 1000; char testbuff[buffsize]; if (rar_handle) { wprintf(L"RAROpenArchiveEx open successed\n"); struct RARHeaderDataEx HeaderDataEx; HeaderDataEx.CmtBuf = NULL; while (RARReadHeaderEx(rar_handle, &HeaderDataEx) == 0) { // Õý³£½âѹ¸ÃÎļþ unsigned long long filesize = ((unsigned long long)HeaderDataEx.UnpSizeHigh << 32) + HeaderDataEx.UnpSize; int err = 0; std::wstring unp_tmpfile = tmp_dir + HeaderDataEx.FileNameW; err = RARProcessFileW(rar_handle, RAR_EXTRACT, (wchar_t*)tmp_dir.c_str(), HeaderDataEx.FileNameW); wprintf(L"RARProcessFileW to %s return %d size %lld %x %x\n", unp_tmpfile.c_str(), err, filesize, HeaderDataEx.UnpVer, HeaderDataEx.Method); } RARCloseArchive(rar_handle); } rar_handle = RAROpenArchiveEx(&ArchiveDataEx); if (rar_handle) { wprintf(L"RAROpenArchiveEx open successed\n"); struct RARHeaderDataEx HeaderDataEx; HeaderDataEx.CmtBuf = NULL; while (RARReadHeaderEx(rar_handle, &HeaderDataEx) == 0) { unsigned long long filesize = ((unsigned long long)HeaderDataEx.UnpSizeHigh << 32) + HeaderDataEx.UnpSize; int err = 0; std::wstring unp_tmpfile = tmp_dir + HeaderDataEx.FileNameW; err = RARExtractChunkInit(rar_handle, HeaderDataEx.FileName); if (err != 0) { wprintf(L"RARExtractChunkInit return error %d\n", err); continue; } FILE* unp_filehandle = NULL; err = _wfopen_s(&unp_filehandle, unp_tmpfile.c_str(), L"rb"); if (err) { wprintf(L"open extracted file fail %d %d\n", err, unp_filehandle); continue; } // ˳Ðò²âÊÔ int iExtractRet = 0; unsigned long long fpos = 0; do { iExtractRet = RARExtractChunk(rar_handle, (char*)testbuff, buffsize); // Compare if (compare_filebinary(unp_filehandle, fpos, testbuff, iExtractRet, 0)) { wprintf(L"Sequence compare difference found at %lld for %d\n", fpos, buffsize); break; } //else // wprintf(L"Sequence compare is same %lld %d\n", fpos, iExtractRet); fpos += iExtractRet; } while(iExtractRet > 0); // Ëæ»ú²âÊÔ for (int i = 0; i < 100; i++) { unsigned long long ll_pos = rand() * filesize/RAND_MAX; RARExtractChunkSeek(rar_handle, ll_pos, SEEK_SET); RARExtractChunk(rar_handle, (char*)testbuff, buffsize); // Compare if (compare_filebinary(unp_filehandle, ll_pos, testbuff, iExtractRet, 0)) { wprintf(L"Random compare difference found at %lld\n", ll_pos); break; } //else // wprintf(L"Random compare is same %lld\n", ll_pos); } wprintf(L"RARExtractChunk test for %s finished\n", unp_tmpfile.c_str()); } RARCloseArchive(rar_handle); } wprintf(L"Test finished\n"); scanf_s("%d"); return 0; }
ComicBookRAR::ComicBookRAR(wxString file, wxUint32 cacheLen, COMICAL_ZOOM zoom, long zoomLevel, bool fitOnlyOversize, COMICAL_MODE mode, FREE_IMAGE_FILTER filter, COMICAL_DIRECTION direction, wxInt32 scrollbarThickness) : ComicBook(file, cacheLen, zoom, zoomLevel, fitOnlyOversize, mode, filter, direction, scrollbarThickness) { HANDLE rarFile; int RHCode = 0, PFCode = 0; struct RARHeaderDataEx header; struct RAROpenArchiveDataEx flags; wxString path, new_password; wxInputStream *stream; ComicPage *page; int numEntries, progress=0; open_rar: rarFile = openRar(&flags, &header, RAR_OM_LIST); if (flags.Flags & 0x0080) { // if the headers are encrypted new_password = wxGetPasswordFromUser( wxT("This archive is password-protected. Please enter the password."), wxT("Enter Password")); if (new_password.IsEmpty()) { // the dialog was cancelled, and the archive cannot be opened closeRar(rarFile, &flags); throw ArchiveException(filename, wxT("Comical could not open this file because it is password-protected.")); } SetPassword(new_password.ToAscii()); } if (password) RARSetPassword(rarFile, password); // skip through the entire archive to count the number of entries for (numEntries = 0; RARReadHeaderEx(rarFile, &header) == 0; numEntries++) { if ((PFCode = RARProcessFile(rarFile, RAR_SKIP, NULL, NULL)) != 0) { closeRar(rarFile, &flags); throw ArchiveException(filename, ProcessFileError(PFCode, header.FileNameW)); } } wxProgressDialog progressDlg(wxString(wxT("Opening ")) + file, wxString(), numEntries); progressDlg.SetMinSize(wxSize(400, -1)); // close and re-open the archive to restart at the first header closeRar(rarFile, &flags); rarFile = openRar(&flags, &header, RAR_OM_LIST); while ((RHCode = RARReadHeaderEx(rarFile, &header)) == 0) { path = header.FileNameW; progressDlg.Update(progress, wxString(wxT("Scanning: ")) + path); progressDlg.CentreOnParent(wxHORIZONTAL); stream = ExtractStream(path); page = new ComicPage(path, stream); if (page->GetBitmapType() == wxBITMAP_TYPE_INVALID) delete page; else Pages.push_back(page); wxDELETE(stream); if ((PFCode = RARProcessFileW(rarFile, RAR_SKIP, NULL, NULL)) != 0) { closeRar(rarFile, &flags); throw ArchiveException(filename, ProcessFileError(PFCode, path)); } progressDlg.Update(++progress); } closeRar(rarFile, &flags); // Wrong return code + needs password = wrong password given if (RHCode != ERAR_END_ARCHIVE && flags.Flags & 0x0080) goto open_rar; postCtor(); Create(); // create the wxThread }