3 bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Command)
5 RAROptions *Cmd=Arc.GetRAROptions();
7 int HeaderType=Arc.GetHeaderType();
8 FileHeader *hd=HeaderType==NEWSUB_HEAD ? &Arc.SubHead:&Arc.NewLhd;
9 bool SplitHeader=(HeaderType==FILE_HEAD || HeaderType==NEWSUB_HEAD) &&
10 (hd->Flags & LHD_SPLIT_AFTER)!=0;
12 if (DataIO!=NULL && SplitHeader && hd->UnpVer>=20 &&
13 hd->FileCRC!=0xffffffff && DataIO->PackedCRC!=~hd->FileCRC)
15 Log(Arc.FileName,St(MDataBadCRC),hd->FileName,Arc.FileName);
18 Int64 PrevFullUnpSize = hd->FullUnpSize;
19 Int64 PosBeforeClose=Arc.Tell();
23 strcpy(NextName,Arc.FileName);
24 NextVolumeName(NextName,(Arc.NewMhd.Flags & MHD_NEWNUMBERING)==0 || Arc.OldFormat);
26 #if !defined(SFX_MODULE) && !defined(RARDLL)
27 bool RecoveryDone=false;
29 bool FailedOpen=false,OldSchemeTested=false;
31 while (!Arc.Open(NextName))
36 strcpy(AltNextName,Arc.FileName);
37 NextVolumeName(AltNextName,true);
39 if (Arc.Open(AltNextName))
41 strcpy(NextName,AltNextName);
46 if (Cmd->Callback==NULL && Cmd->ChangeVolProc==NULL ||
47 Cmd->Callback!=NULL && Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LONG)NextName,RAR_VOL_ASK)==-1)
49 Cmd->DllError=ERAR_EOPEN;
53 if (Cmd->ChangeVolProc!=NULL)
58 int RetCode=Cmd->ChangeVolProc(NextName,RAR_VOL_ASK);
64 Cmd->DllError=ERAR_EOPEN;
71 #if !defined(SFX_MODULE) && !defined(_WIN_CE)
75 RecVol.Restore(Cmd,Arc.FileName,Arc.FileNameW,true);
82 if (!Cmd->VolumePause && !IsRemovable(NextName))
84 Log(Arc.FileName,St(MAbsNextVol),NextName);
90 if (Cmd->AllYes || !AskNextVol(NextName))
100 Arc.Open(Arc.FileName,Arc.FileNameW);
101 Arc.Seek(PosBeforeClose,SEEK_SET);
106 if (Cmd->Callback!=NULL &&
107 Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LONG)NextName,RAR_VOL_NOTIFY)==-1)
109 if (Cmd->ChangeVolProc!=NULL)
114 int RetCode=Cmd->ChangeVolProc(NextName,RAR_VOL_NOTIFY);
123 if (Command=='T' || Command=='X' || Command=='E')
125 mprintf(St(Command=='T' ? MTestVol:MExtrVol),Arc.FileName);
129 Arc.SearchBlock(HeaderType);
133 if (Arc.GetHeaderType()==FILE_HEAD)
135 Arc.ConvertAttributes();
136 Arc.Seek(Arc.NextBlockPos-Arc.NewLhd.FullPackSize,SEEK_SET);
141 mprintf(St(MExtrPoints),IntNameToExt(Arc.NewLhd.FileName));
142 if (!Cmd->DisablePercentage)
149 if (hd->FullUnpSize == 0)
151 // some archives only have correct UnpSize in the first volume
152 hd->FullUnpSize = PrevFullUnpSize;
157 if (HeaderType==ENDARC_HEAD)
158 DataIO->UnpVolume=false;
161 DataIO->UnpVolume=(hd->Flags & LHD_SPLIT_AFTER);
162 DataIO->SetPackedSizeToRead(hd->FullPackSize);
165 DataIO->UnpArcSize=Arc.FileLength();
166 DataIO->CurUnpRead=0;
168 DataIO->PackedCRC=0xffffffff;
169 // DataIO->SetFiles(&Arc,NULL);
180 bool AskNextVol(char *ArcName)
182 eprintf(St(MAskNextVol),ArcName);
183 if (Ask(St(MContinueQuit))==2)