-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathrar_func.cpp
117 lines (81 loc) · 2.11 KB
/
rar_func.cpp
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
112
113
114
115
116
117
/*############################################################################
## NEONCUBE - RAGNAROK ONLINE PATCH CLIENT (GNU General Public License)
##
## http://openkore.sourceforge.net/neoncube
## (c) 2005 Ansell "Cliffe" Cruz ([email protected])
##
##############################################################################*/
#include "precompiled.h"
#include "rar_func.h"
#include "neondef.h"
extern void PostError(BOOL exitapp, LPCTSTR lpszErrMessage, ...);
BOOL
ExtractRAR(LPSTR fname, LPCSTR fpath)
{
HANDLE hData;
INT RHCode;
INT PFCode;
RARHeaderData HeaderData;
RAROpenArchiveDataEx OpenArchiveData;
//memset
ZeroMemory(&OpenArchiveData, sizeof(OpenArchiveData));
OpenArchiveData.ArcName = fname;
OpenArchiveData.CmtBuf = NULL;
OpenArchiveData.CmtBufSize = 0;
OpenArchiveData.OpenMode = RAR_OM_EXTRACT;
hData = RAROpenArchiveEx(&OpenArchiveData);
if(OpenArchiveData.OpenResult != 0)
{
PostRarError(OpenArchiveData.OpenResult, fname);
return FALSE;
}
while((RHCode = RARReadHeader(hData,&HeaderData)) == 0)
{
if(lstrcmpA(fpath, "FLD") == 0)
{
//folder
PFCode = RARProcessFile(hData,RAR_EXTRACT, NULL, NULL);
}
else if(lstrcmpA(fpath, "GRF") == 0)
{
//patches goes to GRF file
PFCode = RARProcessFile(hData, RAR_EXTRACT, "neoncube\\", NULL);
}
else
{
PostError(TRUE, "Invalid flag %s: Must be FLD or GRF", fpath);
}
if(PFCode != 0)
{
PostError(TRUE, "Failed to extract %s: Archive header broken", fname);
}
}
if(RHCode == ERAR_BAD_DATA)
{
PostRarError(ERAR_BAD_DATA, fname);
return FALSE;
}
RARCloseArchive(hData);
return TRUE;
}
void
PostRarError(int Error,LPTSTR ArcName)
{
switch(Error)
{
case ERAR_NO_MEMORY:
PostError(FALSE, "Not enough memory to open %s", ArcName);
break;
case ERAR_EOPEN:
PostError(FALSE, "Cannot open %s", ArcName);
break;
case ERAR_BAD_ARCHIVE:
PostError(FALSE, "%s is not a valid RAR archive", ArcName);
break;
case ERAR_BAD_DATA:
PostError(FALSE, "Header data broken: %s", ArcName);
break;
default:
PostError(FALSE, "Unknown Error: %s", ArcName);
}
}