55
56
Data->Cmd.Callback=r->Callback;
56
57
Data->Cmd.UserData=r->UserData;
58
if (!Data->Arc.Open(r->ArcName,r->ArcNameW))
59
if (!Data->Arc.Open(r->ArcName,r->ArcNameW,0))
60
61
r->OpenResult=ERAR_EOPEN;
86
87
Data->Extract.ExtractArchiveInit(&Data->Cmd,Data->Arc);
87
88
return((HANDLE)Data);
90
catch (RAR_EXIT ErrCode)
91
r->OpenResult=RarErrorToDll(ErrCode);
92
if (Data!=NULL && Data->Cmd.DllError!=0)
93
r->OpenResult=Data->Cmd.DllError;
95
r->OpenResult=RarErrorToDll(ErrCode);
100
catch (std::bad_alloc) // Catch 'new' exception.
102
r->OpenResult=ERAR_NO_MEMORY;
106
118
int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *D)
108
DataSet *Data=(DataSet *)hArcData;
111
if ((Data->HeaderSize=(int)Data->Arc.SearchBlock(FILE_HEAD))<=0)
113
if (Data->Arc.Volume && Data->Arc.GetHeaderType()==ENDARC_HEAD &&
114
(Data->Arc.EndArcHead.Flags & EARC_NEXT_VOLUME))
115
if (MergeArchive(Data->Arc,NULL,false,'L'))
117
Data->Extract.SignatureFound=false;
118
Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
119
return(RARReadHeader(hArcData,D));
123
return(Data->Arc.BrokenFileHeader ? ERAR_BAD_DATA:ERAR_END_ARCHIVE);
125
if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE))
127
int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL);
129
return(RARReadHeader(hArcData,D));
133
strncpyz(D->ArcName,Data->Arc.FileName,ASIZE(D->ArcName));
134
strncpyz(D->FileName,Data->Arc.NewLhd.FileName,ASIZE(D->FileName));
135
D->Flags=Data->Arc.NewLhd.Flags;
136
D->PackSize=Data->Arc.NewLhd.PackSize;
137
D->UnpSize=Data->Arc.NewLhd.UnpSize;
138
D->HostOS=Data->Arc.NewLhd.HostOS;
139
D->FileCRC=Data->Arc.NewLhd.FileCRC;
140
D->FileTime=Data->Arc.NewLhd.FileTime;
141
D->UnpVer=Data->Arc.NewLhd.UnpVer;
142
D->Method=Data->Arc.NewLhd.Method;
143
D->FileAttr=Data->Arc.NewLhd.FileAttr;
149
return(RarErrorToDll(ErrCode));
120
struct RARHeaderDataEx X;
121
memset(&X,0,sizeof(X));
123
int Code=RARReadHeaderEx(hArcData,&X);
125
strncpyz(D->ArcName,X.ArcName,ASIZE(D->ArcName));
126
strncpyz(D->FileName,X.FileName,ASIZE(D->FileName));
128
D->PackSize=X.PackSize;
129
D->UnpSize=X.UnpSize;
131
D->FileCRC=X.FileCRC;
132
D->FileTime=X.FileTime;
135
D->FileAttr=X.FileAttr;
171
159
return(ERAR_EOPEN);
172
160
return(Data->Arc.BrokenFileHeader ? ERAR_BAD_DATA:ERAR_END_ARCHIVE);
174
if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE))
162
if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE)!=0)
176
164
int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL);
287
275
bool Repeat=false;
288
276
Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat);
278
// Now we process extra file information if any.
290
280
// Archive can be closed if we process volumes, next volume is missing
291
281
// and current one is already removed or deleted. So we need to check
292
282
// if archive is still open to avoid calling file operations on
301
291
Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
294
catch (RAR_EXIT ErrCode)
306
return(RarErrorToDll(ErrCode));
296
return(Data->Cmd.DllError!=0 ? Data->Cmd.DllError:RarErrorToDll(ErrCode));
308
298
return(Data->Cmd.DllError);
347
337
void PASCAL RARSetPassword(HANDLE hArcData,char *Password)
349
339
DataSet *Data=(DataSet *)hArcData;
350
GetWideName(Password,NULL,Data->Cmd.Password,ASIZE(Data->Cmd.Password));
340
wchar PasswordW[MAXPASSWORD];
341
GetWideName(Password,NULL,PasswordW,ASIZE(PasswordW));
342
Data->Cmd.Password.Set(PasswordW);
343
cleandata(PasswordW,sizeof(PasswordW));