Tree @c0d9a00f-f9b0-43de-aeca-61dd1e9422d4/main (Download .tar.gz)
- debian
- acknow.txt
- arccmt.cpp
- archive.cpp
- archive.hpp
- arcmem.cpp
- arcmem.hpp
- arcread.cpp
- array.hpp
- blake2s.cpp
- blake2s.hpp
- blake2s_sse.cpp
- blake2sp.cpp
- cmddata.cpp
- cmddata.hpp
- coder.cpp
- coder.hpp
- compress.hpp
- consio.cpp
- consio.hpp
- crc.cpp
- crc.hpp
- crypt.cpp
- crypt.hpp
- crypt1.cpp
- crypt2.cpp
- crypt3.cpp
- crypt5.cpp
- dll.cpp
- dll.def
- dll.hpp
- dll.rc
- encname.cpp
- encname.hpp
- errhnd.cpp
- errhnd.hpp
- extinfo.cpp
- extinfo.hpp
- extract.cpp
- extract.hpp
- filcreat.cpp
- filcreat.hpp
- file.cpp
- file.hpp
- filefn.cpp
- filefn.hpp
- filestr.cpp
- filestr.hpp
- find.cpp
- find.hpp
- getbits.cpp
- getbits.hpp
- global.cpp
- global.hpp
- hardlinks.cpp
- hash.cpp
- hash.hpp
- headers.cpp
- headers.hpp
- headers5.hpp
- isnt.cpp
- isnt.hpp
- license.txt
- list.cpp
- list.hpp
- loclang.hpp
- log.cpp
- log.hpp
- makefile
- match.cpp
- match.hpp
- model.cpp
- model.hpp
- options.cpp
- options.hpp
- os.hpp
- pathfn.cpp
- pathfn.hpp
- qopen.cpp
- qopen.hpp
- rar.cpp
- rar.hpp
- rardefs.hpp
- rarlang.hpp
- raros.hpp
- rarpch.cpp
- rartypes.hpp
- rarvm.cpp
- rarvm.hpp
- rawint.hpp
- rawread.cpp
- rawread.hpp
- rdwrfn.cpp
- rdwrfn.hpp
- readme.txt
- recvol.cpp
- recvol.hpp
- recvol3.cpp
- recvol5.cpp
- resource.cpp
- resource.hpp
- rijndael.cpp
- rijndael.hpp
- rs.cpp
- rs.hpp
- rs16.cpp
- rs16.hpp
- savepos.hpp
- scantree.cpp
- scantree.hpp
- secpassword.cpp
- secpassword.hpp
- sha1.cpp
- sha1.hpp
- sha256.cpp
- sha256.hpp
- smallfn.cpp
- smallfn.hpp
- strfn.cpp
- strfn.hpp
- strlist.cpp
- strlist.hpp
- suballoc.cpp
- suballoc.hpp
- system.cpp
- system.hpp
- threadmisc.cpp
- threadpool.cpp
- threadpool.hpp
- timefn.cpp
- timefn.hpp
- ui.cpp
- ui.hpp
- uicommon.cpp
- uiconsole.cpp
- uisilent.cpp
- ulinks.cpp
- unicode.cpp
- unicode.hpp
- unpack.cpp
- unpack.hpp
- unpack15.cpp
- unpack20.cpp
- unpack30.cpp
- unpack50.cpp
- unpack50frag.cpp
- unpack50mt.cpp
- unpackinline.cpp
- UnRAR.vcxproj
- UnRARDll.vcxproj
- uowners.cpp
- version.hpp
- volume.cpp
- volume.hpp
- win32acl.cpp
- win32lnk.cpp
- win32stm.cpp
recvol.cpp @c0d9a00f-f9b0-43de-aeca-61dd1e9422d4/main — raw · history · blame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include "rar.hpp" #include "recvol3.cpp" #include "recvol5.cpp" bool RecVolumesRestore(RAROptions *Cmd,const wchar *Name,bool Silent) { Archive Arc(Cmd); if (!Arc.Open(Name)) { if (!Silent) ErrHandler.OpenErrorMsg(Name); return false; } RARFORMAT Fmt=RARFMT15; if (Arc.IsArchive(true)) Fmt=Arc.Format; else { byte Sign[REV5_SIGN_SIZE]; Arc.Seek(0,SEEK_SET); if (Arc.Read(Sign,REV5_SIGN_SIZE)==REV5_SIGN_SIZE && memcmp(Sign,REV5_SIGN,REV5_SIGN_SIZE)==0) Fmt=RARFMT50; } Arc.Close(); // We define RecVol as local variable for proper stack unwinding when // handling exceptions. So it can close and delete files on Cancel. if (Fmt==RARFMT15) { RecVolumes3 RecVol(false); return RecVol.Restore(Cmd,Name,Silent); } else { RecVolumes5 RecVol(false); return RecVol.Restore(Cmd,Name,Silent); } } void RecVolumesTest(RAROptions *Cmd,Archive *Arc,const wchar *Name) { wchar RevName[NM]; *RevName=0; if (Arc!=NULL) { // We received .rar or .exe volume as a parameter, trying to find // the matching .rev file number 1. bool NewNumbering=Arc->NewNumbering; wchar ArcName[NM]; wcsncpyz(ArcName,Name,ASIZE(ArcName)); wchar *VolNumStart=VolNameToFirstName(ArcName,ArcName,ASIZE(ArcName),NewNumbering); wchar RecVolMask[NM]; wcsncpyz(RecVolMask,ArcName,ASIZE(RecVolMask)); size_t BaseNamePartLength=VolNumStart-ArcName; wcsncpyz(RecVolMask+BaseNamePartLength,L"*.rev",ASIZE(RecVolMask)-BaseNamePartLength); FindFile Find; Find.SetMask(RecVolMask); FindData RecData; while (Find.Next(&RecData)) { wchar *Num=GetVolNumPart(RecData.Name); if (*Num!='1') // Name must have "0...01" numeric part. continue; bool FirstVol=true; while (--Num>=RecData.Name && IsDigit(*Num)) if (*Num!='0') { FirstVol=false; break; } if (FirstVol) { wcsncpyz(RevName,RecData.Name,ASIZE(RevName)); Name=RevName; break; } } if (*RevName==0) // First .rev file not found. return; } File RevFile; if (!RevFile.Open(Name)) { ErrHandler.OpenErrorMsg(Name); // It also sets RARX_OPEN. return; } mprintf(L"\n"); byte Sign[REV5_SIGN_SIZE]; bool Rev5=RevFile.Read(Sign,REV5_SIGN_SIZE)==REV5_SIGN_SIZE && memcmp(Sign,REV5_SIGN,REV5_SIGN_SIZE)==0; RevFile.Close(); if (Rev5) { RecVolumes5 RecVol(true); RecVol.Test(Cmd,Name); } else { RecVolumes3 RecVol(true); RecVol.Test(Cmd,Name); } } |