diff options
Diffstat (limited to 'unrar/unrar/volume.cpp')
| -rw-r--r-- | unrar/unrar/volume.cpp | 63 |
1 files changed, 29 insertions, 34 deletions
diff --git a/unrar/unrar/volume.cpp b/unrar/unrar/volume.cpp index 9a79662..4c138db 100644 --- a/unrar/unrar/volume.cpp +++ b/unrar/unrar/volume.cpp @@ -19,39 +19,17 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman } Int64 PosBeforeClose=Arc.Tell(); + + if (DataIO!=NULL) + DataIO->ProcessedArcSize+=Arc.FileLength(); + Arc.Close(); char NextName[NM]; wchar NextNameW[NM]; - *NextNameW=0; strcpy(NextName,Arc.FileName); - NextVolumeName(NextName,(Arc.NewMhd.Flags & MHD_NEWNUMBERING)==0 || Arc.OldFormat); - - if (*Arc.FileNameW!=0) - { - // Copy incremented trailing low ASCII volume name part to Unicode name. - // It is simpler than also implementing Unicode version of NextVolumeName. - - strcpyw(NextNameW,Arc.FileNameW); - char *NumPtr=GetVolNumPart(NextName); - - // moving to first digit in volume number - while (NumPtr>NextName && isdigit(*NumPtr) && isdigit(*(NumPtr-1))) - NumPtr--; - - // also copy the first character before volume number, - // because it can be changed when going from .r99 to .s00 - if (NumPtr>NextName) - NumPtr--; - - int CharsToCopy=strlen(NextName)-(NumPtr-NextName); - int DestPos=strlenw(NextNameW)-CharsToCopy; - if (DestPos>0) - { - CharToWide(NumPtr,NextNameW+DestPos,ASIZE(NextNameW)-DestPos-1); - NextNameW[ASIZE(NextNameW)-1]=0; - } - } + strcpyw(NextNameW,Arc.FileNameW); + NextVolumeName(NextName,NextNameW,ASIZE(NextName),(Arc.NewMhd.Flags & MHD_NEWNUMBERING)==0 || Arc.OldFormat); #if !defined(SFX_MODULE) && !defined(RARDLL) bool RecoveryDone=false; @@ -60,22 +38,33 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman while (!Arc.Open(NextName,NextNameW)) { + // We need to open a new volume which size was not calculated + // in total size before, so we cannot calculate the total progress + // anymore. Let's reset the total size to zero and stop + // the total progress. + if (DataIO!=NULL) + DataIO->TotalArcSize=0; + if (!OldSchemeTested) { + // Checking for new style volumes renamed by user to old style + // name format. Some users did it for unknown reason. char AltNextName[NM]; + wchar AltNextNameW[NM]; strcpy(AltNextName,Arc.FileName); - NextVolumeName(AltNextName,true); + strcpyw(AltNextNameW,Arc.FileNameW); + NextVolumeName(AltNextName,AltNextNameW,ASIZE(AltNextName),true); OldSchemeTested=true; - if (Arc.Open(AltNextName)) + if (Arc.Open(AltNextName,AltNextNameW)) { strcpy(NextName,AltNextName); - *NextNameW=0; + strcpyw(NextNameW,AltNextNameW); break; } } #ifdef RARDLL if (Cmd->Callback==NULL && Cmd->ChangeVolProc==NULL || - Cmd->Callback!=NULL && Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LONG)NextName,RAR_VOL_ASK)==-1) + Cmd->Callback!=NULL && Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LPARAM)NextName,RAR_VOL_ASK)==-1) { Cmd->DllError=ERAR_EOPEN; FailedOpen=true; @@ -123,6 +112,7 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman FailedOpen=true; break; } + #endif // RARDLL *NextNameW=0; } @@ -138,7 +128,7 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman Arc.CheckArc(true); #ifdef RARDLL if (Cmd->Callback!=NULL && - Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LONG)NextName,RAR_VOL_NOTIFY)==-1) + Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LPARAM)NextName,RAR_VOL_NOTIFY)==-1) return(false); if (Cmd->ChangeVolProc!=NULL) { @@ -197,8 +187,13 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman } #ifdef SFX_MODULE DataIO->UnpArcSize=Arc.FileLength(); - DataIO->CurUnpRead=0; #endif + + // Reset the size of packed data read from current volume. It is used + // to display the total progress and preceding volumes are already + // compensated with ProcessedArcSize, so we need to reset this variable. + DataIO->CurUnpRead=0; + DataIO->PackedCRC=0xffffffff; // DataIO->SetFiles(&Arc,NULL); } |
