Current News
Archived News
Search News
Discussion Forum


Old Forum
Install Programs More Downloads...
Troubleshooting
Source Code
Format Specs.
Misc. Information
Non-SF Stuff
Links




1 VERSION 4.00
2 Begin VB.Form MpqEx 
3    Caption         =   "WinMPQ"
4    ClientHeight    =   3510
5    ClientLeft      =   1245
6    ClientTop       =   1785
7    ClientWidth     =   6690
8    Height          =   4200
9    Icon            =   "listing.frx":0000
10    KeyPreview      =   -1  'True
11    Left            =   1185
12    LinkTopic       =   "Form1"
13    ScaleHeight     =   3510
14    ScaleWidth      =   6690
15    Top             =   1155
16    Width           =   6810
17    Begin VB.Timer Timer1 
18       Enabled         =   0   'False
19       Interval        =   2500
20       Left            =   6120
21       Top             =   2160
22    End
23    Begin VB.TextBox txtCommand 
24       BackColor       =   &H8000000F&
25       Height          =   285
26       Left            =   1440
27       TabIndex        =   1
28       Top             =   2880
29       Width           =   4695
30    End
31    Begin VB.CommandButton cmdGo 
32       Caption         =   "Go"
33       Height          =   285
34       Left            =   6120
35       TabIndex        =   2
36       Top             =   2880
37       Width           =   495
38    End
39    Begin VB.ComboBox mFilter 
40       Height          =   315
41       ItemData        =   "listing.frx":27A2
42       Left            =   5220
43       List            =   "listing.frx":27A9
44       Sorted          =   -1  'True
45       TabIndex        =   3
46       Text            =   "*"
47       Top             =   30
48       Width           =   675
49    End
50    Begin MSComctlLib.Toolbar Toolbar 
51       Align           =   1  'Align Top
52       Height          =   345
53       Left            =   0
54       TabIndex        =   5
55       Top             =   0
56       Width           =   6690
57       _ExtentX        =   11800
58       _ExtentY        =   609
59       ButtonWidth     =   1535
60       ButtonHeight    =   556
61       Wrappable       =   0   'False
62       Appearance      =   1
63       Style           =   1
64       ImageList       =   "ImageList1"
65       _Version        =   393216
66       BeginProperty Buttons {66833FE8-8583-11D1-B16A-00C0F0283628} 
67          NumButtons      =   8
68          BeginProperty Button1 {66833FEA-8583-11D1-B16A-00C0F0283628} 
69             Caption         =   "New"
70             Key             =   "New"
71             Description     =   "Create a new archive"
72             ToolTipText     =   "Create a new archive"
73             ImageIndex      =   1
74          EndProperty
75          BeginProperty Button2 {66833FEA-8583-11D1-B16A-00C0F0283628} 
76             Caption         =   "Open"
77             Key             =   "Open"
78             Description     =   "Open an existing archive"
79             ToolTipText     =   "Open an existing archive"
80          EndProperty
81          BeginProperty Button3 {66833FEA-8583-11D1-B16A-00C0F0283628} 
82             Enabled         =   0   'False
83             Caption         =   "Add"
84             Key             =   "Add"
85             Description     =   "Add files to the archive"
86             ToolTipText     =   "Add files to the archive"
87          EndProperty
88          BeginProperty Button4 {66833FEA-8583-11D1-B16A-00C0F0283628} 
89             Enabled         =   0   'False
90             Caption         =   "Add Folder"
91             Key             =   "Add Folder"
92             Description     =   "Add files from a folder and its subfolders"
93             ToolTipText     =   "Add files from a folder and its subfolders"
94          EndProperty
95          BeginProperty Button5 {66833FEA-8583-11D1-B16A-00C0F0283628} 
96             Enabled         =   0   'False
97             Caption         =   "Extract"
98             Key             =   "Extract"
99             Description     =   "Extract files from the archive"
100             ToolTipText     =   "Extract files from the archive"
101          EndProperty
102          BeginProperty Button6 {66833FEA-8583-11D1-B16A-00C0F0283628} 
103             Enabled         =   0   'False
104             Caption         =   "Compact"
105             Key             =   "Compact"
106             Description     =   "Clear deleted files from the archive"
107             ToolTipText     =   "Clear deleted files from the archive"
108          EndProperty
109          BeginProperty Button7 {66833FEA-8583-11D1-B16A-00C0F0283628} 
110             Enabled         =   0   'False
111             Key             =   "filterspace"
112             Style           =   4
113             Object.Width           =   675
114          EndProperty
115          BeginProperty Button8 {66833FEA-8583-11D1-B16A-00C0F0283628} 
116             Enabled         =   0   'False
117             Caption         =   "List"
118             Key             =   "List"
119          EndProperty
120       EndProperty
121    End
122    Begin VB.Label Label1 
123       AutoSize        =   -1  'True
124       Caption         =   " MPQ2k &Command  "
125       Height          =   195
126       Left            =   0
127       TabIndex        =   6
128       Top             =   2880
129       Width           =   1425
130    End
131    Begin MSComctlLib.ImageList ImageList1 
132       Left            =   6120
133       Top             =   1560
134       _ExtentX        =   1005
135       _ExtentY        =   1005
136       BackColor       =   -2147483643
137       ImageWidth      =   1
138       ImageHeight     =   1
139       MaskColor       =   12632256
140       _Version        =   393216
141       BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628} 
142          NumListImages   =   1
143          BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628} 
144             Picture         =   "listing.frx":27B0
145             Key             =   ""
146          EndProperty
147       EndProperty
148    End
149    Begin MSComctlLib.StatusBar StatBar 
150       Align           =   2  'Align Bottom
151       Height          =   300
152       Left            =   0
153       TabIndex        =   4
154       Top             =   3210
155       Width           =   6690
156       _ExtentX        =   11800
157       _ExtentY        =   529
158       _Version        =   393216
159       BeginProperty Panels {8E3867A5-8586-11D1-B16A-00C0F0283628} 
160          NumPanels       =   2
161          BeginProperty Panel1 {8E3867AB-8586-11D1-B16A-00C0F0283628} 
162             AutoSize        =   1
163             Object.Width           =   5664
164             MinWidth        =   2
165             Key             =   "FileInfo"
166          EndProperty
167          BeginProperty Panel2 {8E3867AB-8586-11D1-B16A-00C0F0283628} 
168             AutoSize        =   1
169             Object.Width           =   5664
170             MinWidth        =   2
171             Key             =   "MpqInfo"
172          EndProperty
173       EndProperty
174    End
175    Begin MSComctlLib.ListView List 
176       Height          =   2295
177       Left            =   0
178       TabIndex        =   0
179       Top             =   360
180       Width           =   6015
181       _ExtentX        =   10610
182       _ExtentY        =   4048
183       View            =   3
184       Arrange         =   2
185       Sorted          =   -1  'True
186       MultiSelect     =   -1  'True
187       LabelWrap       =   -1  'True
188       HideSelection   =   -1  'True
189       OLEDragMode     =   1
190       OLEDropMode     =   1
191       AllowReorder    =   -1  'True
192       _Version        =   393217
193       ForeColor       =   -2147483640
194       BackColor       =   -2147483643
195       BorderStyle     =   1
196       Appearance      =   1
197       BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} 
198          Name            =   "MS Sans Serif"
199          Size            =   8.25
200          Charset         =   0
201          Weight          =   400
202          Underline       =   0   'False
203          Italic          =   0   'False
204          Strikethrough   =   0   'False
205       EndProperty
206       OLEDragMode     =   1
207       OLEDropMode     =   1
208       NumItems        =   6
209       BeginProperty ColumnHeader(1) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
210          Key             =   "N"
211          Text            =   "Name"
212          Object.Width           =   5080
213       EndProperty
214       BeginProperty ColumnHeader(2) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
215          Alignment       =   1
216          SubItemIndex    =   1
217          Key             =   "S"
218          Text            =   "Size"
219          Object.Width           =   1905
220       EndProperty
221       BeginProperty ColumnHeader(3) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
222          Alignment       =   1
223          SubItemIndex    =   2
224          Key             =   "R"
225          Text            =   "Ratio"
226          Object.Width           =   1129
227       EndProperty
228       BeginProperty ColumnHeader(4) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
229          Alignment       =   1
230          SubItemIndex    =   3
231          Key             =   "PK"
232          Text            =   "Packed"
233          Object.Width           =   1905
234       EndProperty
235       BeginProperty ColumnHeader(5) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
236          SubItemIndex    =   4
237          Key             =   "LCID"
238          Text            =   "Locale ID"
239          Object.Width           =   1129
240       EndProperty
241       BeginProperty ColumnHeader(6) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
242          SubItemIndex    =   5
243          Key             =   "A"
244          Text            =   "Attributes"
245          Object.Width           =   1129
246       EndProperty
247    End
248    Begin VB.Menu mnuFile 
249       Caption         =   "&File"
250       Begin VB.Menu mnuFNew 
251          Caption         =   "&New..."
252          Shortcut        =   ^N
253       End
254       Begin VB.Menu mnuFOpen 
255          Caption         =   "&Open..."
256          Shortcut        =   ^O
257       End
258       Begin VB.Menu mnuFReopen 
259          Caption         =   "&Reopen Mpq"
260          Shortcut        =   {F5}
261       End
262       Begin VB.Menu mnuFScript 
263          Caption         =   "Run Mo'PaQ 2000 &Script..."
264          Shortcut        =   ^S
265       End
266       Begin VB.Menu mnuFSep 
267          Caption         =   "-"
268       End
269       Begin VB.Menu mnuFExit 
270          Caption         =   "E&xit"
271       End
272       Begin VB.Menu mnuFRecent 
273          Caption         =   "-"
274          Index           =   0
275          Visible         =   0   'False
276       End
277    End
278    Begin VB.Menu mnuMpq 
279       Caption         =   "&Mpq"
280       Enabled         =   0   'False
281       Begin VB.Menu mnuMItem 
282          Caption         =   "&Open"
283          Index           =   0
284          Visible         =   0   'False
285       End
286       Begin VB.Menu mnuMSep1 
287          Caption         =   "-"
288          Visible         =   0   'False
289       End
290       Begin VB.Menu mnuMExtract 
291          Caption         =   "&Extract"
292          Shortcut        =   ^E
293       End
294       Begin VB.Menu mnuMDelete 
295          Caption         =   "&Delete         Del or"
296          Shortcut        =   ^D
297       End
298       Begin VB.Menu mnuMRename 
299          Caption         =   "Rena&me"
300          Shortcut        =   ^R
301       End
302       Begin VB.Menu mnuMChLCID 
303          Caption         =   "Change Locale &ID..."
304          Shortcut        =   ^I
305       End
306       Begin VB.Menu mnuMSep2 
307          Caption         =   "-"
308       End
309       Begin VB.Menu mnuMAdd 
310          Caption         =   "&Add..."
311          Shortcut        =   ^A
312       End
313       Begin VB.Menu mnuMAddFolder 
314          Caption         =   "Add &Folder..."
315          Shortcut        =   ^F
316       End
317       Begin VB.Menu mnuMCompression 
318          Caption         =   "&Compression"
319          Begin VB.Menu mnuMCAuto 
320             Caption         =   "Auto-Select"
321             Checked         =   -1  'True
322             Shortcut        =   {F4}
323          End
324          Begin VB.Menu mnuMCSep 
325             Caption         =   "-"
326          End
327          Begin VB.Menu mnuMCNone 
328             Caption         =   "&None"
329             Shortcut        =   {F2}
330          End
331          Begin VB.Menu mnuMCStandard 
332             Caption         =   "&Standard"
333             Shortcut        =   {F3}
334          End
335          Begin VB.Menu mnuMCDeflate 
336             Caption         =   "&Deflate"
337             Shortcut        =   {F9}
338          End
339          Begin VB.Menu mnuMCAudio 
340             Caption         =   "&Audio"
341             Begin VB.Menu mnuMCALowest 
342                Caption         =   "&Lowest (Best quality)"
343                Shortcut        =   {F6}
344             End
345             Begin VB.Menu mnuMCAMedium 
346                Caption         =   "&Medium"
347                Shortcut        =   {F7}
348             End
349             Begin VB.Menu mnuMCAHighest 
350                Caption         =   "&Highest (Least space)"
351                Shortcut        =   {F8}
352             End
353          End
354       End
355       Begin VB.Menu mnuMEncrypt 
356          Caption         =   "Encr&ypt Files"
357       End
358       Begin VB.Menu mnuMCompact 
359          Caption         =   "Com&pact"
360          Shortcut        =   ^P
361       End
362       Begin VB.Menu mnuMAddToList 
363          Caption         =   "Add File to Li&sting..."
364          Shortcut        =   ^K
365       End
366       Begin VB.Menu mnuMSaveList 
367          Caption         =   "Save File &List..."
368          Shortcut        =   ^L
369       End
370    End
371    Begin VB.Menu mnuTools 
372       Caption         =   "&Tools"
373       Begin VB.Menu mnuTItem 
374          Caption         =   "(Empty)"
375          Enabled         =   0   'False
376          Index           =   0
377       End
378       Begin VB.Menu mnuTSep 
379          Caption         =   "-"
380       End
381       Begin VB.Menu mnuTMpqEmbed 
382          Caption         =   "MPQ Embedder"
383       End
384       Begin VB.Menu mnuTSep2 
385          Caption         =   "-"
386       End
387       Begin VB.Menu mnuTAdd 
388          Caption         =   "&Add/Remove..."
389       End
390    End
391    Begin VB.Menu mnuOptions 
392       Caption         =   "&Options..."
393    End
394    Begin VB.Menu mnuHelp 
395       Caption         =   "&Help"
396       Begin VB.Menu mnuHReadme 
397          Caption         =   "View &Readme..."
398          Shortcut        =   {F1}
399       End
400       Begin VB.Menu mnuHSep 
401          Caption         =   "-"
402       End
403       Begin VB.Menu mnuHAbout 
404          Caption         =   "&About..."
405       End
406    End
407    Begin VB.Menu mnuPopup 
408       Caption         =   "Popup Menu"
409       Visible         =   0   'False
410       Begin VB.Menu mnuPItem 
411          Caption         =   "&Open"
412          Index           =   0
413       End
414       Begin VB.Menu mnuPSep1 
415          Caption         =   "-"
416       End
417       Begin VB.Menu mnuPTools 
418          Caption         =   "&Tools"
419          Begin VB.Menu mnuPTItem 
420             Caption         =   "(Empty)"
421             Index           =   0
422          End
423       End
424       Begin VB.Menu mnuPSep2 
425          Caption         =   "-"
426       End
427       Begin VB.Menu mnuPExtract 
428          Caption         =   "&Extract"
429       End
430       Begin VB.Menu mnuPDelete 
431          Caption         =   "&Delete"
432       End
433       Begin VB.Menu mnuPRename 
434          Caption         =   "Rena&me"
435       End
436       Begin VB.Menu mnuPChLCID 
437          Caption         =   "Change Locale &ID..."
438       End
439    End
440 End
441 Attribute VB_Name = "MpqEx"
442 Attribute VB_Creatable = False
443 Attribute VB_Exposed = False
444 Option Explicit
446 Dim txtCommandHasFocus As Boolean, ShiftState As Boolean
447 Dim OpenFiles() As String, OpenFileDates() As Date, MpqDate As Date
448 Sub AddRecentFile(rFileName As String)
449 Dim bNum As Long, fNum As Long
450 NewKey AppKey + "Recent\"
451 For bNum = 1 To 8
452     If LCase(GetReg(AppKey + "Recent\File" + CStr(bNum))) = LCase(rFileName) Then
453         For fNum = bNum To 7
454             If Not IsEmpty(GetReg(AppKey + "Recent\File" + CStr(fNum + 1))) Then
455                 SetReg AppKey + "Recent\File" + CStr(fNum), GetReg(AppKey + "Recent\File" + CStr(fNum + 1))
456             Else
457                 Exit For
458             End If
459         Next fNum
460         SetReg AppKey + "Recent\File" + CStr(fNum), rFileName
461         Exit For
462     End If
463 Next bNum
464 If fNum = 0 Then
465     For bNum = 1 To 8
466         If IsEmpty(GetReg(AppKey + "Recent\File" + CStr(bNum))) Then
467             SetReg AppKey + "Recent\File" + CStr(bNum), rFileName
468             Exit For
469         ElseIf bNum = 8 Then
470             For fNum = 1 To 7
471                 SetReg AppKey + "Recent\File" + CStr(fNum), GetReg(AppKey + "Recent\File" + CStr(fNum + 1))
472             Next fNum
473             SetReg AppKey + "Recent\File" + CStr(bNum), rFileName
474         End If
475     Next bNum
476 End If
477 BuildRecentFileList
478 End Sub
479 Sub BuildMpqActionList()
480 Dim Shift As Integer
481 On Error GoTo NotSelected
482 List.SelectedItem.Tag = List.SelectedItem.Tag
483 On Error GoTo 0
484 If List.SelectedItem.Selected = True Then
485     Shift = 0
486     If ShiftState = True Then Shift = vbShiftMask
487     mnuMItem(0).Visible = True
488     mnuMSep1.Visible = True
489     BuildPopup List.SelectedItem.Tag, Shift, mnuMpq, mnuMItem
490 Else
491     GoTo NotSelected
492 End If
493 Exit Sub
494 NotSelected:
495 Dim PItem As Menu
496 For Each PItem In mnuMItem
497     If PItem.Index <> 0 Then Unload PItem
498 Next PItem
499 mnuMItem(0).Visible = False
500 mnuMSep1.Visible = False
501 End Sub
502 Sub BuildPopup(FileName As String, Shift As Integer, mnuRoot As Menu, mnuItem)
503 Dim aNum As Long, aItem As String, aName As String, bNum As Long, PItem As Menu, dItem As String
504 mnuRoot.Tag = 0
505 For Each PItem In mnuItem
506     If PItem.Index <> 0 Then Unload PItem
507 Next PItem
508 If InStr(FileName, ".") = 0 Then
509     GoSub AddGlobal
510 Else
511     For bNum = 1 To Len(FileName)
512         If InStr(bNum, FileName, ".") > 0 Then
513             bNum = InStr(bNum, FileName, ".")
514         Else
515             Exit For
516         End If
517     Next bNum
518     aName = Mid(FileName, bNum - 1)
519     aName = GetReg("HKEY_CLASSES_ROOT\" + aName + "\")
520     If aName = "" Then
521         GoSub AddGlobal
522         Exit Sub
523     End If
524     dItem = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\", "open")
525     dItem = GetReg(SharedAppKey + "FileDefaultActions\" + aName, dItem)
526     If dItem <> "" And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + dItem + "\command\")) Then
527         If LCase(dItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + dItem + "\")) Then
528             mnuItem(0).Caption = "Op&en with..."
529         Else
530             mnuItem(0).Caption = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + dItem + "\", "&" + UCase(Left(dItem, 1)) + Mid(dItem, 2))
531         End If
532         mnuItem(0).Tag = dItem
533         mnuRoot.Tag = 1
534         aNum = 0
535         bNum = 1
536     Else
537         aItem = EnumKey("HKEY_CLASSES_ROOT\" + aName + "\shell\", 0)
538         If aItem = "" Then
539             GoSub AddGlobal
540             Exit Sub
541         End If
542         If Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\command\")) Then
543             If LCase(aItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\")) Then
544                 mnuItem(0).Caption = "Op&en with..."
545             Else
546                 mnuItem(0).Caption = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\", "&" + UCase(Left(aItem, 1)) + Mid(aItem, 2))
547             End If
548             mnuItem(0).Tag = aItem
549             mnuRoot.Tag = 1
550             aNum = 1
551             bNum = 1
552         Else
553             aNum = 1
554             bNum = 0
555         End If
556     End If
557     Do
558         aItem = EnumKey("HKEY_CLASSES_ROOT\" + aName + "\shell\", aNum)
559         If aItem <> "" Then
560             If LCase(aItem) <> LCase(dItem) And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\command\")) Then
561                 On Error Resume Next
562                 Load mnuItem(bNum)
563                 On Error GoTo 0
564                 If LCase(aItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\")) Then
565                     mnuItem(bNum).Caption = "Op&en with..."
566                 Else
567                     mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\", "&" + UCase(Left(aItem, 1)) + Mid(aItem, 2))
568                 End If
569                 mnuItem(bNum).Tag = aItem
570                 mnuRoot.Tag = mnuRoot.Tag + 1
571                 bNum = bNum + 1
572             End If
573             aNum = aNum + 1
574         End If
575     Loop Until aItem = ""
576     GoSub AddGlobal
577     If Shift And vbShiftMask Then GoSub AddUnknown
578 End If
579 Exit Sub
580 AddGlobal:
581     aNum = 0
582     bNum = mnuRoot.Tag
583     dItem = ""
584     If bNum = 0 Then
585         dItem = GetReg("HKEY_CLASSES_ROOT\*\shell\", "open")
586         dItem = GetReg(SharedAppKey + "FileDefaultActions\*", dItem)
587         If dItem <> "" And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\*\shell\" + dItem + "\command\")) Then
588             If LCase(dItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\*\shell\" + dItem + "\")) Then
589                 mnuItem(bNum).Caption = "Op&en with..."
590             Else
591                 mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\*\shell\" + dItem + "\", "&" + UCase(Left(dItem, 1)) + Mid(dItem, 2))
592             End If
593             mnuItem(bNum).Tag = dItem
594             mnuRoot.Tag = mnuRoot.Tag + 1
595             bNum = bNum + 1
596         End If
597     End If
598     Do
599         aItem = EnumKey("HKEY_CLASSES_ROOT\*\shell\", aNum)
600         If aItem <> "" Then
601             If LCase(aItem) <> LCase(dItem) And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\*\shell\" + aItem + "\command\")) Then
602                 On Error Resume Next
603                 Load mnuItem(bNum)
604                 On Error GoTo 0
605                 If LCase(aItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\*\shell\" + aItem + "\")) Then
606                     mnuItem(bNum).Caption = "Op&en with..."
607                 Else
608                     mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\*\shell\" + aItem + "\", "&" + UCase(Left(aItem, 1)) + Mid(aItem, 2))
609                 End If
610                 mnuItem(bNum).Tag = aItem
611                 mnuRoot.Tag = mnuRoot.Tag + 1
612                 bNum = bNum + 1
613             End If
614             aNum = aNum + 1
615         End If
616     Loop Until aItem = ""
617     If bNum = 0 Then
618         GoSub AddUnknown
619         Exit Sub
620     End If
621 Return
622 AddUnknown:
623     aNum = 0
624     bNum = mnuRoot.Tag
625     dItem = ""
626     If bNum = 0 Then
627         dItem = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\", "open")
628         dItem = GetReg(SharedAppKey + "FileDefaultActions\Unknown", dItem)
629         If dItem <> "" And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + dItem + "\command\")) Then
630             If LCase(dItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + dItem + "\")) Then
631                 mnuItem(bNum).Caption = "Op&en with..."
632             Else
633                 mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + dItem + "\", "&" + UCase(Left(dItem, 1)) + Mid(dItem, 2))
634             End If
635             mnuItem(bNum).Tag = dItem
636             bNum = bNum + 1
637         End If
638     End If
639     Do
640         aItem = EnumKey("HKEY_CLASSES_ROOT\Unknown\shell\", aNum)
641         If aItem <> "" Then
642             If LCase(aItem) <> LCase(dItem) And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + aItem + "\command\")) Then
643                 On Error Resume Next
644                 Load mnuItem(bNum)
645                 On Error GoTo 0
646                 If LCase(aItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + aItem + "\")) Then
647                     mnuItem(bNum).Caption = "Op&en with..."
648                 Else
649                     mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + aItem + "\", "&" + UCase(Left(aItem, 1)) + Mid(aItem, 2))
650                 End If
651                 mnuItem(bNum).Tag = aItem
652                 bNum = bNum + 1
653             End If
654             aNum = aNum + 1
655         End If
656     Loop Until aItem = ""
657 Return
658 End Sub
659 Sub ChangeLCID(NewLCID As Long)
660 Dim fNum As Long, hMPQ As Long
661 fNum = 1
662 hMPQ = mOpenMpq(CD.FileName)
663 If hMPQ Then
664     Do While fNum <= List.ListItems.Count
665         If List.ListItems.Item(fNum).Selected Then
666             StatBar.Style = 1
667             StatBar.SimpleText = "Changing locale ID of " + List.ListItems.Item(fNum).Tag + " to " + CStr(NewLCID) + "..."
668             MousePointer = 11
669             MpqSetFileLocale hMPQ, List.ListItems.Item(fNum).Tag, List.ListItems.Item(fNum).ListSubItems(4).Tag, NewLCID
670             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
671             List.ListItems.Item(fNum).ListSubItems(4).Tag = NewLCID
672             List.ListItems.Item(fNum).ListSubItems(4).Text = NewLCID
673         End If
674         fNum = fNum + 1
675     Loop
676     MpqCloseUpdatedArchive hMPQ, 0
677 End If
678 StatBar.Style = 0
679 StatBar.SimpleText = ""
680 MousePointer = 0
681 ShowSelected
682 ShowTotal
683 End Sub
684 Sub ConvertCwad()
685     Dim hCwad As Long, hMPQ As Long, hFile As Long, ListBuffer As String, BufSize As Long, Files() As String, buffer() As Byte, fLen As Long, nFile As Long, CwadName As String, dwFlags As Long
687     If CWadOpenArchive(CD.FileName, 0, hCwad) Then
688         MsgBox "This archive must be converted to MPQ format to open it." + vbCrLf + "Enter a name for the converted archive or cancel if you do not want to perform the conversion.", vbInformation, "WinMPQ"
689         CwadName = CD.FileName
690         CD.Flags = &H1000 Or &H4 Or &H2
691         CD.DefaultExt = "mpq"
692         CD.Filter = "Mpq Archive (*.mpq)|*.mpq"
693         CD.hwndOwner = hWnd
694         CD.FileName = CwadName + ".mpq"
695         If ShowSave(CD) Then
696             If CD.FileName = CwadName Then
697                 MsgBox "Cannot overwrite source archive.", vbExclamation, "WinMPQ"
698                 CWadCloseArchive hCwad
699                 Exit Sub
700             End If
702             BufSize = CWadListFiles(hCwad, ListBuffer, 0)
703             If BufSize > 0 Then ListBuffer = String$(BufSize - 1, Chr$(0))
704             CWadListFiles hCwad, ListBuffer, BufSize
705             MultiStringToArray ListBuffer, Files
707             If FileExists(CD.FileName) Then Kill CD.FileName
708             hMPQ = mOpenMpq(CD.FileName)
709             If hMPQ = 0 Then
710                 StatBar.SimpleText = "Can't create archive " + CD.FileName
711             Else
712                 dwFlags = MAFA_REPLACE_EXISTING
713                 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
715                 For nFile = 1 To UBound(Files)
716                     If CWadOpenFile(hCwad, Files(nFile), 0, hFile) Then
717                         fLen = CWadGetFileSize(hFile)
719                         If fLen > 0 Then
720                             ReDim buffer(fLen - 1)
721                         Else
722                             ReDim buffer(0)
723                         End If
725                         CWadSetFilePointer hFile, 0, FILE_BEGIN
726                         CWadReadFile hFile, buffer(0), fLen, fLen
727                         CWadCloseFile hFile
729                         StatBar.SimpleText = "Adding " + Files(nFile) + "..."
730                         MousePointer = 11
731                         If mnuMCNone.Checked Then
732                             MpqAddFileFromBufferEx hMPQ, buffer(0), fLen, Files(nFile), dwFlags, 0, 0
733                         ElseIf mnuMCStandard.Checked Then
734                             MpqAddFileFromBufferEx hMPQ, buffer(0), fLen, Files(nFile), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
735                         ElseIf mnuMCDeflate.Checked Then
736                             MpqAddFileFromBufferEx hMPQ, buffer(0), fLen, Files(nFile), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
737                         ElseIf mnuMCAMedium.Checked Then
738                             MpqAddWaveFromBuffer hMPQ, buffer(0), fLen, Files(nFile), dwFlags Or MAFA_COMPRESS, 0
739                         ElseIf mnuMCAHighest.Checked Then
740                             MpqAddWaveFromBuffer hMPQ, buffer(0), fLen, Files(nFile), dwFlags Or MAFA_COMPRESS, 1
741                         ElseIf mnuMCALowest.Checked Then
742                             MpqAddWaveFromBuffer hMPQ, buffer(0), fLen, Files(nFile), dwFlags Or MAFA_COMPRESS, 2
743                         ElseIf mnuMCAuto.Checked Then
744                             mAddAutoFromBuffer hMPQ, buffer(0), fLen, Files(nFile)
745                         End If
746                     End If
747                 Next nFile
749                 MpqCloseUpdatedArchive hMPQ, 0
750             End If
751         Else
752             CD.FileName = CwadName
753         End If
755         CWadCloseArchive hCwad
756     End If
757 End Sub
759 Sub DelRecentFile(rFileName As String)
760 Dim bNum As Long, fNum As Long
761 For bNum = 1 To 8
762     If LCase(GetReg(AppKey + "Recent\File" + CStr(bNum))) = LCase(rFileName) Then
763         For fNum = bNum To 7
764             SetReg AppKey + "Recent\File" + CStr(fNum), GetReg(AppKey + "Recent\File" + CStr(fNum + 1))
765         Next fNum
766         DelReg AppKey + "Recent\File" + CStr(8)
767         Exit For
768     End If
769 Next bNum
770 BuildRecentFileList
771 End Sub
772 Sub AddToListing(AddedFile As String)
773 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, L6 As String, fSize As Long, cSize As Long, fFlags As Long, hMPQ As Long, hFile As Long
774 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
775     If SFileOpenFileEx(hMPQ, AddedFile, 0, hFile) Then
776         L1 = AddedFile
777         fSize = SFileGetFileSize(hFile, 0)
778         cSize = SFileGetFileInfo(hFile, 6)
779         If fSize / 1024 > 0 And fSize / 1024 < 1 Then
780             L2 = "<1KB"
781         ElseIf fSize = 0 Then
782             L2 = "0KB"
783         Else
784             L2 = CStr(Int(fSize / 1024)) + "KB"
785         End If
786         If cSize / 1024 > 0 And cSize / 1024 < 1 Then
787             L4 = "<1KB"
788         ElseIf cSize = 0 Then
789             L4 = "0KB"
790         Else
791             L4 = CStr(Int(cSize / 1024)) + "KB"
792         End If
793         If fSize <> 0 Then
794             L3 = CStr(Int((1 - cSize / fSize) * 100)) + "%"
795         Else
796             L3 = "0%"
797         End If
798         fFlags = SFileGetFileInfo(hFile, 7)
799         L6 = SFileGetFileInfo(hFile, SFILE_INFO_LOCALEID)
800         If (fFlags And &H200) Or (fFlags And &H100) Then L5 = "C" Else L5 = "-"
801         If fFlags And &H10000 Then L5 = L5 + "E" Else L5 = L5 + "-"
802         If fFlags And &H20000 Then L5 = L5 + "X" Else L5 = L5 + "-"
803         On Error Resume Next
804         lIndex = List.ListItems.Add(, L1, L1).Index
805         On Error GoTo 0
806         If lIndex = 0 Then
807             lIndex = List.ListItems.Item(L1).Index
808             List.ListItems.Item(L1).ListSubItems.Clear
809         End If
810         List.ListItems.Item(lIndex).Tag = L1
811         List.ListItems.Item(lIndex).ListSubItems.Add(, , L2).Tag = fSize
812         If fSize <> 0 Then
813             List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = Int((1 - cSize / fSize) * 100)
814         Else
815             List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = 0
816         End If
817         List.ListItems.Item(lIndex).ListSubItems.Add(, , L4).Tag = cSize
818         List.ListItems.Item(lIndex).ListSubItems.Add(, , L6).Tag = L6
819         List.ListItems.Item(lIndex).ListSubItems.Add(, , L5).Tag = L5
820         SFileCloseFile hFile
821     End If
822     SFileCloseArchive hMPQ
823 End If
824 End Sub
825 Sub FileActionClick(mnuRoot As Menu, mnuItem, Index As Integer)
826 Dim fNum As Long, Path As String, fName As String, fName2 As String, bNum As Long, AlreadyInList As Boolean, hMPQ As Long
827 Path = App.Path
828 If Right(Path, 1) <> "\" Then Path = Path + "\"
829 Path = Path + "Temp_extract\"
830 If ExtractPathNum = -1 Then
831     fNum = 0
832     Do
833     If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
834     fNum = fNum + 1
835     Loop
836     ExtractPathNum = fNum
837 End If
838 Path = Path + CStr(ExtractPathNum) + "\"
839 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
840 For fNum = 1 To List.ListItems.Count
841     If List.ListItems.Item(fNum).Selected Then
842         StatBar.Style = 1
843         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
844         MousePointer = 11
845         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
846         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
847         SFileSetLocale LocaleID
848         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then
849             For bNum = 1 To UBound(OpenFiles)
850                 If LCase(OpenFiles(bNum)) = LCase(List.ListItems.Item(fNum).Tag) Then
851                     AlreadyInList = True
852                     If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(bNum) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
853                     Exit For
854                 End If
855             Next bNum
856             If AlreadyInList = False Then
857                 ReDim Preserve OpenFiles(UBound(OpenFiles) + 1) As String, OpenFileDates(UBound(OpenFileDates) + 1) As Date
858                 OpenFiles(UBound(OpenFiles)) = List.ListItems.Item(fNum).Tag
859                 If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(UBound(OpenFileDates)) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
860             End If
861         End If
862         StatBar.Style = 1
863         StatBar.SimpleText = "Opening " + List.ListItems.Item(fNum).Tag + "..."
864         fName = List.ListItems.Item(fNum).Tag
865         ExecuteFile Path + fName, Index, mnuRoot, mnuItem
866         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then Timer1.Enabled = True
867     End If
868 Next fNum
869 SFileCloseArchive hMPQ
870 StatBar.Style = 0
871 StatBar.SimpleText = ""
872 MousePointer = 0
873 End Sub
874 Sub MpqAddToListing(hMPQ As Long, AddedFile As String)
875 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, L6 As String, fSize As Long, cSize As Long, fFlags As Long, hFile As Long
876 If SFileOpenFileEx(hMPQ, AddedFile, 0, hFile) Then
877     L1 = AddedFile
878     fSize = SFileGetFileSize(hFile, 0)
879     cSize = SFileGetFileInfo(hFile, 6)
880     If fSize / 1024 > 0 And fSize / 1024 < 1 Then
881         L2 = "<1KB"
882     ElseIf fSize = 0 Then
883         L2 = "0KB"
884     Else
885         L2 = CStr(Int(fSize / 1024)) + "KB"
886     End If
887     If cSize / 1024 > 0 And cSize / 1024 < 1 Then
888         L4 = "<1KB"
889     ElseIf cSize = 0 Then
890         L4 = "0KB"
891     Else
892         L4 = CStr(Int(cSize / 1024)) + "KB"
893     End If
894     If fSize <> 0 Then
895         L3 = CStr(Int((1 - cSize / fSize) * 100)) + "%"
896     Else
897         L3 = "0%"
898     End If
899     fFlags = SFileGetFileInfo(hFile, 7)
900     L6 = SFileGetFileInfo(hFile, SFILE_INFO_LOCALEID)
901     If (fFlags And &H200) Or (fFlags And &H100) Then L5 = "C" Else L5 = "-"
902     If fFlags And &H10000 Then L5 = L5 + "E" Else L5 = L5 + "-"
903     If fFlags And &H20000 Then L5 = L5 + "X" Else L5 = L5 + "-"
904     On Error Resume Next
905     lIndex = List.ListItems.Add(, L1, L1).Index
906     On Error GoTo 0
907     If lIndex = 0 Then
908         lIndex = List.ListItems.Item(L1).Index
909         List.ListItems.Item(L1).ListSubItems.Clear
910     End If
911     List.ListItems.Item(lIndex).Tag = L1
912     List.ListItems.Item(lIndex).ListSubItems.Add(, , L2).Tag = fSize
913     If fSize <> 0 Then
914         List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = Int((1 - cSize / fSize) * 100)
915     Else
916         List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = 0
917     End If
918     List.ListItems.Item(lIndex).ListSubItems.Add(, , L4).Tag = cSize
919     List.ListItems.Item(lIndex).ListSubItems.Add(, , L6).Tag = L6
920     List.ListItems.Item(lIndex).ListSubItems.Add(, , L5).Tag = L5
921     SFileCloseFile hFile
922 End If
923 End Sub
924 Sub RemoveFromListing(RemovedFile As String)
925 Dim FileCount As Long
926 On Error GoTo FileRemoved
927 Do
928 List.ListItems.Remove RemovedFile
929 FileCount = FileCount + 1
930 Loop
931 FileRemoved:
932 If FileCount = 0 Then
933     For FileCount = 1 To List.ListItems.Count
934         If LCase(RemovedFile) = LCase(List.ListItems.Item(FileCount).Key) Then
935             List.ListItems.Remove FileCount
936             Exit Sub
937         End If
938     Next FileCount
939 End If
940 End Sub
941 Sub RenameInListing(OldName As String, NewName As String)
942 Dim lIndex As Long
943 If LCase(OldName) <> LCase(NewName) Then RemoveFromListing NewName
944 On Error GoTo RenameError
945 lIndex = List.ListItems.Item(OldName).Index
946 List.ListItems.Item(lIndex).Text = NewName
947 List.ListItems.Item(lIndex).Tag = NewName
948 On Error Resume Next
949 List.ListItems.Item(lIndex).Key = NewName
950 On Error GoTo 0
951 Exit Sub
952 RenameError:
953 For lIndex = 1 To List.ListItems.Count
954     If LCase(OldName) = LCase(List.ListItems.Item(lIndex).Key) Then
955         List.ListItems.Item(lIndex).Text = NewName
956         List.ListItems.Item(lIndex).Tag = NewName
957         On Error Resume Next
958         List.ListItems.Item(lIndex).Key = NewName
959         On Error GoTo 0
960         Exit Sub
961     End If
962 Next lIndex
963 End Sub
964 Sub ExecuteFile(FileName As String, Index As Integer, mnuRoot As Menu, mnuItem)
965 Dim Param As String, bNum As Long, bNum2 As Long, EnvName As String, RetVal As Long, sei As SHELLEXECUTEINFO
966 If Index < mnuRoot.Tag Then
967     With sei
968         .cbSize = Len(sei)
969         .fMask = 0
970         .hWnd = hWnd
971         .lpVerb = mnuItem(Index).Tag
972         .lpFile = FileName
973         .lpParameters = vbNullString
974         .lpDirectory = vbNullString
975         .nShow = 1
976     End With
977     RetVal = ShellExecuteEx(sei)
978 Else
979     With sei
980         .cbSize = Len(sei)
981         .fMask = SEE_MASK_CLASSNAME
982         .hWnd = hWnd
983         .lpVerb = mnuItem(Index).Tag
984         .lpFile = FileName
985         .lpParameters = vbNullString
986         .lpDirectory = vbNullString
987         .nShow = 1
988         .lpClass = "Unknown"
989     End With
990     RetVal = ShellExecuteEx(sei)
991 End If
992 'If RetVal >= 0 And RetVal <= 32 And Index >= mnuRoot.Tag Then
993 '    Param = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + mnuItem(Index).Tag + "\command\")
994 '    Do
995 '        If InStr(Param, "%1") = 0 Then
996 '            Param = Param + " " + FileName
997 '        Else
998 '            bNum = InStr(Param, "%1")
999 '            Param = Left(Param, bNum - 1) + FileName + Mid(Param, bNum + 2)
1000 '        End If
1001 '    Loop While InStr(Param, "%1")
1002 '    bNum = 1
1003 '    Do While bNum <= Len(Param)
1004 '        If InStr(bNum, Param, "%") Then
1005 '            bNum = InStr(bNum, Param, "%")
1006 '            If InStr(bNum + 1, Param, "%") Then
1007 '                bNum2 = InStr(bNum + 1, Param, "%")
1008 '                EnvName = Mid(Param, bNum + 1, bNum2 - bNum - 1)
1009 '                If Environ(EnvName) <> "" Then
1010 '                    Param = Left(Param, bNum - 1) + Environ(EnvName) + Mid(Param, bNum2 + 1)
1011 '                End If
1012 '            End If
1013 '        End If
1014 '        bNum = bNum + 1
1015 '    Loop
1016 '    On Error GoTo NoProgram
1017 '    Shell Param, 1
1018 '    On Error GoTo 0
1019 'End If
1020 'Exit Sub
1021 'NoProgram:
1022 'If Err.Number = 53 Then MsgBox "No program is assigned for this action.", , "WinMPQ"
1023 End Sub
1024 Sub RunMpq2kCommand(CmdLine As String)
1025 Dim sLine As String, pNum As Long, Param() As String, EndParam As Long, CurPath As String, cType As Integer, Rswitch As Boolean, fCount As Long, Files As String, fEndLine As Long, fLine As String, bNum As Long, OldFileName As String, fNum As Long, cNum As Long, FileFilter As String, TItem As Menu, fLine2 As String, fLineTitle As String, hMPQ As Long, hFile As Long, FileShortNames() As String, dwFlags As Long
1026 CurPath = CurDir
1027 If Right(CurPath, 1) <> "\" Then CurPath = CurPath + "\"
1028 sLine = CmdLine
1029 If Right(sLine, 1) <> " " Then sLine = sLine + " "
1030 If sLine <> "" Then
1031     ReDim Param(0) As String
1032     For pNum = 1 To Len(sLine)
1033         If Mid(sLine, pNum, 1) = Chr(34) Then
1034             pNum = pNum + 1
1035             EndParam = InStr(pNum, sLine, Chr(34))
1036         Else
1037             EndParam = InStr(pNum, sLine, " ")
1038         End If
1039         If EndParam = 0 Then EndParam = Len(sLine) + 1
1040         If pNum <> EndParam Then
1041             If Trim(Mid(sLine, pNum, EndParam - pNum)) <> "" Then
1042                 ReDim Preserve Param(UBound(Param) + 1) As String
1043                 Param(UBound(Param)) = Trim(Mid(sLine, pNum, EndParam - pNum))
1044             End If
1045         End If
1046         pNum = EndParam
1047     Next pNum
1048     If UBound(Param) < 3 Then ReDim Preserve Param(3) As String
1049     Select Case LCase(Param(1))
1050     Case "?", "h", "help"
1051         mnuHReadme_Click
1052     Case "o", "open"
1053         OldFileName = CD.FileName
1054         If Param(2) <> "" Then
1055             CD.FileName = FullPath(CurPath, Param(2))
1056         End If
1057         If Param(3) <> "" And FileExists(CD.FileName) = False And CD.FileName <> "" Then
1058             DefaultMaxFiles = Param(3)
1059         End If
1060         If FileExists(CD.FileName) Then
1061             OpenMpq
1062             If CD.FileName = "" Then
1063                 CD.FileName = OldFileName
1064                 StatBar.SimpleText = "The file does not contain an MPQ archive."
1065             Else
1066                 StatBar.SimpleText = "Opened " + CD.FileName
1067                 AddRecentFile CD.FileName
1068             End If
1069         ElseIf FileExists(CD.FileName) = False And CD.FileName <> "" Then
1070             ReDim FileList(0) As String
1071             List.ListItems.Clear
1072             ShowSelected
1073             ShowTotal
1074             NewFile = True
1075             ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
1076             mnuMpq.Enabled = True
1077             For Each TItem In mnuTItem
1078                 TItem.Enabled = True
1079             Next TItem
1080             Toolbar.Buttons.Item("Add").Enabled = True
1081             Toolbar.Buttons.Item("Add Folder").Enabled = True
1082             Toolbar.Buttons.Item("Extract").Enabled = True
1083             Toolbar.Buttons.Item("Compact").Enabled = True
1084             Toolbar.Buttons.Item("List").Enabled = True
1085             If InStr(CD.FileName, "\") > 0 Then
1086                 For bNum = 1 To Len(CD.FileName)
1087                     If InStr(bNum, CD.FileName, "\") > 0 Then
1088                         bNum = InStr(bNum, CD.FileName, "\")
1089                     Else
1090                         Exit For
1091                     End If
1092                 Next bNum
1093             End If
1094             Caption = "WinMPQ - " + Mid(CD.FileName, bNum)
1095             StatBar.SimpleText = "Created new " + CD.FileName
1096             AddRecentFile CD.FileName
1097         ElseIf CD.FileName = "" Then
1098             StatBar.SimpleText = "Required parameter missing"
1099         End If
1100     Case "n", "new"
1101         If Param(2) <> "" Then
1102             CD.FileName = FullPath(CurPath, Param(2))
1103             If Param(3) <> "" Then
1104                 DefaultMaxFiles = Param(3)
1105             End If
1106             If CD.FileName <> "" Then
1107                 ReDim FileList(0) As String
1108                 List.ListItems.Clear
1109                 ShowSelected
1110                 ShowTotal
1111                 NewFile = True
1112                 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
1113                 mnuMpq.Enabled = True
1114                 For Each TItem In mnuTItem
1115                     TItem.Enabled = True
1116                 Next TItem
1117                 Toolbar.Buttons.Item("Add").Enabled = True
1118                 Toolbar.Buttons.Item("Add Folder").Enabled = True
1119                 Toolbar.Buttons.Item("Extract").Enabled = True
1120                 Toolbar.Buttons.Item("Compact").Enabled = True
1121                 Toolbar.Buttons.Item("List").Enabled = True
1122                 If InStr(CD.FileName, "\") > 0 Then
1123                     For bNum = 1 To Len(CD.FileName)
1124                         If InStr(bNum, CD.FileName, "\") > 0 Then
1125                             bNum = InStr(bNum, CD.FileName, "\")
1126                         Else
1127                             Exit For
1128                         End If
1129                     Next bNum
1130                 End If
1131                 Caption = "WinMPQ - " + Mid(CD.FileName, bNum)
1132                 StatBar.SimpleText = "Created new " + CD.FileName
1133                 AddRecentFile CD.FileName
1134             End If
1135         Else
1136             StatBar.SimpleText = "Required parameter missing"
1137         End If
1138     Case "c", "close"
1139         StatBar.SimpleText = "Close is for scripts only"
1140     Case "p", "pause"
1141         StatBar.SimpleText = "Pause not supported"
1142     Case "a", "add"
1143         If CD.FileName <> "" Then
1144             ReDim FileShortNames(0) As String
1145             cType = 0
1146             Rswitch = False
1147             fCount = 0
1148             Files = ""
1149             fEndLine = 0
1150             fLine = ""
1151             dwFlags = MAFA_REPLACE_EXISTING
1152             If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
1153             For pNum = 3 To UBound(Param)
1154                 If LCase(Param(pNum)) = "/wav" Then
1155                     cType = 2
1156                     dwFlags = dwFlags Or MAFA_COMPRESS
1157                 ElseIf LCase(Param(pNum)) = "/c" And cType < 2 Then
1158                     cType = 1
1159                     dwFlags = dwFlags Or MAFA_COMPRESS
1160                 ElseIf LCase(Param(pNum)) = "/auto" And cType < 1 Then
1161                     cType = -1
1162                 ElseIf LCase(Param(pNum)) = "/r" Then
1163                     Rswitch = True
1164                 End If
1165             Next pNum
1166             If Left(Param(3), 1) = "/" Or Param(3) = "" Then
1167                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1168                     Param(3) = ""
1169                 Else
1170                     Param(3) = Param(2)
1171                 End If
1172             End If
1173             If Left(Param(2), 1) <> "/" And Param(2) <> "" Then
1174                 If InStr(Param(2), "\") > 0 Then
1175                     For pNum = 1 To Len(Param(2))
1176                         If InStr(pNum, Param(2), "\") > 0 Then
1177                             pNum = InStr(pNum, Param(2), "\")
1178                             Files = Left(Param(2), pNum)
1179                         End If
1180                     Next pNum
1181                 End If
1182                 MousePointer = 11
1183                 If NewFile = True Then
1184                     If FileExists(CD.FileName) Then Kill CD.FileName
1185                     NewFile = False
1186                 End If
1187                 Files = DirEx(Files, Mid(Param(2), Len(Files) + 1), 6, Rswitch)
1188                 List.Sorted = False
1189                 FileFilter = mFilter
1190                 hMPQ = mOpenMpq(CD.FileName)
1191                 If hMPQ = 0 Then
1192                     StatBar.SimpleText = "Can't create archive " + CD.FileName
1193                     Exit Sub
1194                 End If
1195                 For pNum = 1 To Len(Files)
1196                     fEndLine = InStr(pNum, Files, vbCrLf)
1197                     fLine = Mid(Files, pNum, fEndLine - pNum)
1198                     If cType = 0 Then
1199                         StatBar.SimpleText = "Adding " + fLine + "..."
1200                     ElseIf cType = 1 Then
1201                         StatBar.SimpleText = "Adding compressed " + fLine + "..."
1202                     ElseIf cType = 2 Then
1203                         StatBar.SimpleText = "Adding compressed WAV " + fLine + "..."
1204                     ElseIf cType = -1 Then
1205                         StatBar.SimpleText = "Adding " + fLine + " (compression auto-select)..."
1206                     End If
1207                     If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1208                         If Right(Param(3), 1) <> "\" And Param(3) <> "" Then Param(3) = Param(3) + "\"
1209                         If cType = 2 Then
1210                             MpqAddWaveToArchive hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, 0
1211                         ElseIf cType = -1 Then
1212                             mAddAutoFile hMPQ, FullPath(CurPath, fLine), Param(3) + fLine
1213                         ElseIf cType = 1 Then
1214                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, DefaultCompress, DefaultCompressLevel
1215                         Else
1216                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, 0, 0
1217                         End If
1218                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1219                         mFilter.AddItem "*" + GetExtension(Param(3) + fLine)
1220                         For cNum = 1 To mFilter.ListCount - 1
1221                             If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
1222                                 mFilter.RemoveItem cNum
1223                                 Exit For
1224                             End If
1225                         Next cNum
1226                         If MatchesFilter(Param(3) + fLine, FileFilter) Then
1227                             ReDim Preserve FileShortNames(UBound(FileShortNames) + 1) As String
1228                             FileShortNames(UBound(FileShortNames)) = Param(3) + fLine
1229                         End If
1230                     Else
1231                         If cType = 2 Then
1232                             MpqAddWaveToArchive hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, 0
1233                         ElseIf cType = -1 Then
1234                             mAddAutoFile hMPQ, FullPath(CurPath, fLine), Param(3)
1235                         ElseIf cType = 1 Then
1236                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, DefaultCompress, DefaultCompressLevel
1237                         Else
1238                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, 0, 0
1239                         End If
1240                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1241                         mFilter.AddItem "*" + GetExtension(Param(3))
1242                         For cNum = 1 To mFilter.ListCount - 1
1243                             If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
1244                                 mFilter.RemoveItem cNum
1245                                 Exit For
1246                             End If
1247                         Next cNum
1248                         If MatchesFilter(Param(3), FileFilter) Then
1249                             ReDim Preserve FileShortNames(UBound(FileShortNames) + 1) As String
1250                             FileShortNames(UBound(FileShortNames)) = Param(3)
1251                         End If
1252                     End If
1253                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1254                     fCount = fCount + 1
1255                     pNum = fEndLine + 1
1256                 Next pNum
1257                 MpqCloseUpdatedArchive hMPQ, 0
1258                 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1259                 If UBound(FileShortNames) > 1 Then
1260                     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
1261                         StatBar.SimpleText = "Adding files to listing... 0% complete"
1262                         For pNum = 1 To UBound(FileShortNames)
1263                             If MatchesFilter(FileShortNames(pNum), FileFilter) Then
1264                                 MpqAddToListing hMPQ, FileShortNames(pNum)
1265                             End If
1266                             On Error Resume Next
1267                             StatBar.SimpleText = "Adding files to listing... " + CStr(Int((pNum / UBound(FileShortNames)) * 100)) + "% complete"
1268                             On Error GoTo 0
1269                         Next pNum
1270                         SFileCloseArchive hMPQ
1271                     End If
1272                 ElseIf UBound(FileShortNames) = 1 Then
1273                     AddToListing FileShortNames(1)
1274                 End If
1275                 MousePointer = 0
1276                 If MatchesFilter("(listfile)", FileFilter) Then
1277                     AddToListing "(listfile)"
1278                 End If
1279                 mFilter = FileFilter
1280                 List.Sorted = True
1281                 RemoveDuplicates
1282                 ShowTotal
1283                 If fCount > 1 Then
1284                     StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " added"
1285                 End If
1286             Else
1287                 StatBar.SimpleText = "Required parameter missing"
1288             End If
1289         Else
1290             StatBar.SimpleText = "No archive open"
1291         End If
1292     Case "e", "extract"
1293         If CD.FileName <> "" Then
1294             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Extracting " + Param(2) + "..."
1295             cType = 0
1296             For pNum = 3 To UBound(Param)
1297                 If LCase(Param(pNum)) = "/fp" Then
1298                     cType = 1
1299                     Exit For
1300                 End If
1301             Next pNum
1302             If Left(Param(3), 1) = "/" Then Param(3) = ""
1303             If Param(3) = "" Then Param(3) = "."
1304             If Left(Param(2), 1) <> "/" And Param(2) <> "" Then
1305                 MousePointer = 11
1306                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1307                     Files = MpqDir(CD.FileName, Param(2))
1308                     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then
1309                         StatBar.SimpleText = "Can't open archive " + CD.FileName
1310                         Exit Sub
1311                     End If
1312                     For pNum = 1 To Len(Files)
1313                         fEndLine = InStr(pNum, Files, vbCrLf)
1314                         fLine = Mid(Files, pNum, fEndLine - pNum)
1315                         StatBar.SimpleText = "Extracting " + fLine + "..."
1316                         sGetFile hMPQ, fLine, FullPath(CurPath, Param(3)), cType
1317                         StatBar.SimpleText = StatBar.SimpleText + " Done"
1318                         fCount = fCount + 1
1319                         pNum = fEndLine + 1
1320                     Next pNum
1321                     SFileCloseArchive hMPQ
1322                     If fCount > 1 Then
1323                         StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " extracted"
1324                     End If
1325                 Else
1326                     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then
1327                         StatBar.SimpleText = "Can't open archive " + CD.FileName
1328                         Exit Sub
1329                     End If
1330                     sGetFile hMPQ, Param(2), FullPath(CurPath, Param(3)), cType
1331                     SFileCloseArchive hMPQ
1332                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1333                 End If
1334                 MousePointer = 0
1335             Else
1336                 StatBar.SimpleText = "Required parameter missing"
1337             End If
1338         Else
1339             StatBar.SimpleText = "No archive open"
1340         End If
1341     Case "r", "ren", "rename"
1342         If CD.FileName <> "" Then
1343             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Renaming " + Param(2) + " => " + Param(3) + "..."
1344             If Param(2) <> "" And Param(3) <> "" Then
1345                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1346                     If InStr(Param(3), "*") <> 0 Or InStr(Param(3), "?") <> 0 Then
1347                         Files = MpqDir(CD.FileName, Param(2))
1348                         hMPQ = mOpenMpq(CD.FileName)
1349                         If hMPQ Then
1350                             For pNum = 1 To Len(Files)
1351                                 fEndLine = InStr(pNum, Files, vbCrLf)
1352                                 fLine = Mid(Files, pNum, fEndLine - pNum)
1353                                 fLine2 = RenameWithFilter(fLine, Param(2), Param(3))
1354                                 StatBar.SimpleText = "Renaming " + fLine + " => " + fLine2 + "..."
1355                                 If SFileOpenFileEx(hMPQ, fLine2, 0, hFile) Then
1356                                     SFileCloseFile hFile
1357                                     MpqDeleteFile hMPQ, fLine2
1358                                     MpqRenameFile hMPQ, fLine, fLine2
1359                                 Else
1360                                     MpqRenameFile hMPQ, fLine, fLine2
1361                                 End If
1362                                 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1363                                 RenameInListing fLine, fLine2
1364                                 StatBar.SimpleText = StatBar.SimpleText + " Done"
1365                                 fCount = fCount + 1
1366                                 pNum = fEndLine + 1
1367                             Next pNum
1368                             MpqCloseUpdatedArchive hMPQ, 0
1369                             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1370                         End If
1371                         If fCount > 1 Then
1372                             StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " renamed"
1373                         End If
1374                     Else
1375                     StatBar.SimpleText = "You must use wildcards with new name"
1376                     End If
1377                 Else
1378                     hMPQ = mOpenMpq(CD.FileName)
1379                     If hMPQ Then
1380                         If SFileOpenFileEx(hMPQ, Param(3), 0, hFile) Then
1381                             SFileCloseFile hFile
1382                             MpqDeleteFile hMPQ, Param(3)
1383                             MpqRenameFile hMPQ, Param(2), Param(3)
1384                         Else
1385                             MpqRenameFile hMPQ, Param(2), Param(3)
1386                         End If
1387                         MpqCloseUpdatedArchive hMPQ, 0
1388                     End If
1389                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1390                     RenameInListing Param(2), Param(3)
1391                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1392                 End If
1393             Else
1394                 StatBar.SimpleText = "Required parameter missing"
1395             End If
1396         Else
1397             StatBar.SimpleText = "No archive open"
1398         End If
1399     Case "m", "move"
1400         If CD.FileName <> "" Then
1401             For pNum = 1 To Len(Param(2))
1402                 If InStr(pNum, Param(2), "\") Then
1403                     pNum = InStr(pNum, Param(2), "\")
1404                 Else
1405                     Exit For
1406                 End If
1407             Next pNum
1408             fLineTitle = Mid(Param(2), pNum)
1409             If Right(Param(3), 1) <> "\" And Param(3) <> "" Then Param(3) = Param(3) + "\"
1410             Param(3) = Param(3) + fLineTitle
1411             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Moving " + Param(2) + " => " + Param(3) + "..."
1412             If (Left(Param(2), 1) <> "/" And Param(2) <> "") And (Left(Param(3), 1) <> "/") Then
1413                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1414                     Files = MpqDir(CD.FileName, Param(2))
1415                     hMPQ = mOpenMpq(CD.FileName)
1416                     If hMPQ Then
1417                         For pNum = 1 To Len(Files)
1418                             fEndLine = InStr(pNum, Files, vbCrLf)
1419                             fLine = Mid(Files, pNum, fEndLine - pNum)
1420                             fLine2 = RenameWithFilter(fLine, Param(2), Param(3))
1421                             StatBar.SimpleText = "Moving " + fLine + " => " + fLine2 + "..."
1422                             If SFileOpenFileEx(hMPQ, fLine2, 0, hFile) Then
1423                                 SFileCloseFile hFile
1424                                 MpqDeleteFile hMPQ, fLine2
1425                                 MpqRenameFile hMPQ, fLine, fLine2
1426                             Else
1427                                 MpqRenameFile hMPQ, fLine, fLine2
1428                             End If
1429                             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1430                             RenameInListing fLine, fLine2
1431                             StatBar.SimpleText = StatBar.SimpleText + " Done"
1432                             fCount = fCount + 1
1433                             pNum = fEndLine + 1
1434                         Next pNum
1435                         MpqCloseUpdatedArchive hMPQ, 0
1436                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1437                     End If
1438                     If fCount > 1 Then
1439                         StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " moved"
1440                     End If
1441                 Else
1442                     hMPQ = mOpenMpq(CD.FileName)
1443                     If hMPQ Then
1444                         If SFileOpenFileEx(hMPQ, Param(3), 0, hFile) Then
1445                             SFileCloseFile hFile
1446                             MpqDeleteFile hFile, Param(3)
1447                             MpqRenameFile hFile, Param(2), Param(3)
1448                         Else
1449                             MpqRenameFile hFile, Param(2), Param(3)
1450                         End If
1451                         MpqCloseUpdatedArchive hMPQ, 0
1452                     End If
1453                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1454                     RenameInListing Param(2), Param(3)
1455                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1456                 End If
1457             Else
1458                 StatBar.SimpleText = "Required parameter missing"
1459             End If
1460         Else
1461             StatBar.SimpleText = "No archive open"
1462         End If
1463     Case "d", "del", "delete"
1464         If CD.FileName <> "" Then
1465             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Deleting " + Param(2) + "..."
1466             If Left(Param(2), 1) <> "/" And Param(2) <> "" Then
1467                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1468                     Files = MpqDir(CD.FileName, Param(2))
1469                     hMPQ = mOpenMpq(CD.FileName)
1470                     If hMPQ Then
1471                         For pNum = 1 To Len(Files)
1472                             fEndLine = InStr(pNum, Files, vbCrLf)
1473                             fLine = Mid(Files, pNum, fEndLine - pNum)
1474                             StatBar.SimpleText = "Deleting " + fLine + "..."
1475                             MpqDeleteFile hMPQ, fLine
1476                             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1477                             RemoveFromListing fLine
1478                             StatBar.SimpleText = StatBar.SimpleText + " Done"
1479                             fCount = fCount + 1
1480                             pNum = fEndLine + 1
1481                         Next pNum
1482                         MpqCloseUpdatedArchive hMPQ, 0
1483                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1484                     End If
1485                     If fCount > 1 Then
1486                         StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " deleted"
1487                     End If
1488                 Else
1489                     hMPQ = mOpenMpq(CD.FileName)
1490                     If hMPQ Then
1491                         MpqDeleteFile hMPQ, Param(2)
1492                         MpqCloseUpdatedArchive hMPQ, 0
1493                     End If
1494                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1495                     RemoveFromListing Param(2)
1496                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1497                 End If
1498             Else
1499                 StatBar.SimpleText = "Required parameter missing"
1500             End If
1501         Else
1502             StatBar.SimpleText = "No archive open"
1503         End If
1504     Case "f", "flush", "compact"
1505         If CD.FileName <> "" Then
1506             MousePointer = 11
1507             StatBar.SimpleText = "Flushing " + CD.FileName + "..."
1508             hMPQ = mOpenMpq(CD.FileName)
1509             If hMPQ Then
1510                 MpqCompactArchive hMPQ
1511                 MpqCloseUpdatedArchive hMPQ, 0
1512             End If
1513             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1514             StatBar.SimpleText = StatBar.SimpleText + " Done"
1515             MousePointer = 0
1516             OpenMpq
1517         Else
1518             StatBar.SimpleText = "No archive open"
1519         End If
1520     Case "l", "list"
1521         If CD.FileName <> "" Then
1522             If Param(2) <> "" Then
1523                 StatBar.SimpleText = "Creating list..."
1524                 MousePointer = 11
1525                 If (InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0) And Param(3) <> "" Then
1526                     Files = MpqDir(CD.FileName, Param(2))
1527                     Param(2) = Param(3)
1528                 Else
1529                     Files = MpqDir(CD.FileName, "*")
1530                 End If
1531                 fNum = FreeFile
1532                 Open FullPath(CurPath, Param(2)) For Binary As #fNum
1533                 Put #fNum, 1, Files
1534                 Close #fNum
1535                 StatBar.SimpleText = StatBar.SimpleText + " Done"
1536                 MousePointer = 0
1537             Else
1538                 StatBar.SimpleText = "Required parameter missing"
1539             End If
1540         Else
1541             StatBar.SimpleText = "No archive open"
1542         End If
1543     Case "s", "script"
1544         StatBar.SimpleText = "Running script " + Param(2) + "..."
1545         If Param(2) <> "" Then
1546             MousePointer = 11
1547             RunScript FullPath(CurPath, Param(2))
1548             MousePointer = 0
1549             StatBar.SimpleText = StatBar.SimpleText + " Done"
1550         Else
1551             StatBar.SimpleText = "Required parameter missing"
1552         End If
1553     Case "x", "exit", "quit"
1554         Unload Me
1555     Case Else
1556         If Left(Param(1), 1) <> ";" Then
1557             If LCase(Param(1)) = "cd" Or LCase(Param(1)) = "chdir" Then
1558                 On Error Resume Next
1559                 ChDir Param(2)
1560                 On Error GoTo 0
1561                 txtCommand_GotFocus
1562             ElseIf Left(LCase(Param(1)), 3) = "cd." Or Left(LCase(Param(1)), 3) = "cd\" Then
1563                 On Error Resume Next
1564                 ChDir Mid(Param(1), 3)
1565                 On Error GoTo 0
1566                 txtCommand_GotFocus
1567             ElseIf Left(LCase(Param(1)), 6) = "chdir." Or Left(LCase(Param(1)), 6) = "chdir\" Then
1568                 On Error Resume Next
1569                 ChDir Mid(Param(1), 6)
1570                 On Error GoTo 0
1571                 txtCommand_GotFocus
1572             ElseIf Mid(Param(1), 2, 1) = ":" And (Len(Param(1)) = 2 Or Right(Param(1), 1) = "\") Then
1573                 On Error Resume Next
1574                 ChDrive Left(Param(1), 2)
1575                 On Error GoTo 0
1576                 txtCommand_GotFocus
1577             Else
1578                 Shell "command.com /k " + sLine, 1
1579             End If
1580         End If
1581     End Select
1582 End If
1583 End Sub
1584 Sub BuildRecentFileList()
1585 Dim rNum As Long, rNum2 As Long, RecentFile As String, FirstSep As Long, LastSep As Long, RItem As Menu
1586 For Each RItem In mnuFRecent
1587     If RItem.Index <> 0 Then Unload RItem
1588 Next RItem
1589 rNum2 = 1
1590 For rNum = 8 To 1 Step -1
1591     RecentFile = GetReg(AppKey + "Recent\File" + CStr(rNum))
1592     If FileExists(RecentFile) Then
1593         mnuFRecent(0).Visible = True
1594         On Error Resume Next
1595         Load mnuFRecent(rNum2)
1596         On Error GoTo 0
1597         mnuFRecent(rNum2).Tag = RecentFile
1598         If TextWidth(RecentFile) > TextWidth("________________________________") Then
1599             FirstSep = InStr(RecentFile, "\")
1600             If FirstSep > 0 Then
1601                 For LastSep = FirstSep + 1 To Len(RecentFile)
1602                     If InStr(LastSep, RecentFile, "\") > 0 Then
1603                         LastSep = InStr(LastSep, RecentFile, "\")
1604                     Else
1605                         Exit For
1606                     End If
1607                 Next LastSep
1608                 RecentFile = Left(RecentFile, FirstSep) + "..." + Mid(RecentFile, LastSep - 1)
1609             End If
1610         End If
1611         mnuFRecent(rNum2).Caption = "&" + CStr(rNum2) + " " + RecentFile
1612         rNum2 = rNum2 + 1
1613     End If
1614     If rNum2 > 4 Then Exit For
1615 Next rNum
1616 End Sub
1617 Sub BuildToolsList()
1618 Dim tNum As Long, ToolName As String, ToolCommand, TItem As Menu
1619 For Each TItem In mnuTItem
1620     If TItem.Index <> 0 Then Unload TItem
1621 Next TItem
1622 For Each TItem In mnuPTItem
1623     If TItem.Index <> 0 Then Unload TItem
1624 Next TItem
1625 mnuTItem(0).Caption = "(Empty)"
1626 mnuPTItem(0).Caption = mnuTItem(0).Caption
1627 mnuTItem(0).Tag = ""
1628 mnuPTItem(0).Tag = ""
1629 Do
1630     ToolName = GetReg(AppKey + "Tools\Name" + CStr(tNum))
1631     ToolCommand = GetReg(AppKey + "Tools\Command" + CStr(tNum))
1632     If ToolName = "" Then ToolName = ToolCommand
1633     If ToolName <> "" Then
1634         On Error Resume Next
1635         Load mnuTItem(tNum)
1636         Load mnuPTItem(tNum)
1637         On Error GoTo 0
1638         mnuTItem(tNum).Tag = ToolCommand
1639         mnuPTItem(tNum).Tag = mnuTItem(tNum).Tag
1640         If InStr(ToolName, "&") = 0 And tNum < 9 Then
1641             mnuTItem(tNum).Caption = "&" + CStr(tNum + 1) + " " + ToolName
1642         ElseIf InStr(ToolName, "&") = 0 And tNum = 9 Then
1643             mnuTItem(tNum).Caption = "&0 " + ToolName
1644         Else
1645             mnuTItem(tNum).Caption = ToolName
1646         End If
1647         mnuPTItem(tNum).Caption = mnuTItem(tNum).Caption
1648     End If
1649     tNum = tNum + 1
1650 Loop Until ToolName = ""
1651 End Sub
1652 Sub OpenMpq()
1653 Dim Path, FileCont As String, bNum As Long, FileLine As String, nFiles As Long, MpqFileName As String, FileFilter As String, TItem As Menu, hMPQ As Long, hFile As Long, FileEntries() As FILELISTENTRY
1654 On Error Resume Next
1655 If FileExists(CD.FileName) And FileLen(CD.FileName) = 0 Then
1656     ReDim FileList(0) As String
1657     List.ListItems.Clear
1658     ShowSelected
1659     ShowTotal
1660     NewFile = True
1661     On Error GoTo 0
1662     GoTo FileOpened
1663 End If
1664 On Error GoTo 0
1666 If IsMPQ(CD.FileName) = False Then
1667     ConvertCwad
1668 End If
1670 If IsMPQ(CD.FileName) = False Then
1671     CD.FileName = ""
1672     MsgBox "This file does not contain an MPQ archive.", vbExclamation, "WinMPQ"
1673     Exit Sub
1674 End If
1675 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then
1676     CD.FileName = ""
1677     MsgBox "The MPQ archive could not be opened.", vbExclamation, "WinMPQ"
1678     Exit Sub
1679 End If
1680 StatBar.Style = 1
1681 StatBar.SimpleText = "Loading list..."
1682 MousePointer = 11
1683 Path = App.Path: If Right(Path, 1) <> "\" Then Path = Path + "\"
1684 ReDim FileList(0) As String
1685 #If InternalListing Then
1686 FileList(0) = "(listfile)"
1687 If Mpq.FileExists(CD.FileName, "(listfile)") Then
1688     FileCont = Mpq.GetFileEx(CD.FileName, "(listfile)", 0, -1)
1689 #Else
1690     sListFiles CD.FileName, hMPQ, ListFile, FileEntries
1691 #End If
1692     For bNum = 1 To Len(FileCont)
1693         If InStr(bNum, FileCont, vbCrLf) > 0 Then
1694             ReDim Preserve FileList(UBound(FileList) + 1) As String
1695             FileList(UBound(FileList)) = Mid(FileCont, bNum, InStr(bNum, FileCont, vbCrLf) - bNum)
1696             bNum = InStr(bNum, FileCont, vbCrLf) + 1
1697         Else
1698             ReDim Preserve FileList(UBound(FileList) + 1) As String
1699             FileList(UBound(FileList)) = Mid(FileCont, bNum)
1700             Exit For
1701         End If
1702     Next bNum
1703 #If InternalListing Then
1704 End If
1705 nFiles = UBound(FileList)
1706 ReDim Preserve FileList(UBound(FileList) + UBound(GlobalFileList)) As String
1707 For bNum = nFiles + 1 To UBound(FileList)
1708     FileList(bNum) = GlobalFileList(bNum - nFiles)
1709 Next bNum
1710 #End If
1711 Dim fNum As Long, lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, L6 As String, fSize As Long, cSize As Long, fFlags As Long
1712 SendMessageA List.hWnd, WM_SETREDRAW, 0, ByVal 0&
1713 List.ListItems.Clear
1714 List.Sorted = False
1715 FileFilter = mFilter
1716 StatBar.SimpleText = "Building list... 0% complete"
1717 mFilter.Clear
1718 For fNum = 0 To UBound(FileEntries)
1719 #If InternalListing Then
1720     If Mpq.FileExists(CD.FileName, FileList(fNum)) Then
1721 #End If
1722     If FileEntries(fNum).dwFileExists Then
1723     MpqFileName = StrConv(FileEntries(fNum).szFileName, vbUnicode)
1724     StripNull MpqFileName
1725     mFilter.AddItem "*" + GetExtension(MpqFileName)
1726     For bNum = 1 To mFilter.ListCount - 1
1727         If LCase(mFilter.List(bNum)) = LCase(mFilter.List(bNum - 1)) Then
1728             mFilter.RemoveItem bNum
1729             Exit For
1730         End If
1731     Next bNum
1732     If MatchesFilter(MpqFileName, FileFilter) Then
1733         L1 = MpqFileName
1734                 fSize = FileEntries(fNum).dwFullSize
1735                 cSize = FileEntries(fNum).dwCompressedSize
1736                 If fSize / 1024 > 0 And fSize / 1024 < 1 Then
1737                     L2 = "<1KB"
1738                 ElseIf fSize = 0 Then
1739                     L2 = "0KB"
1740                 Else
1741                     L2 = CStr(Int(fSize / 1024)) + "KB"
1742                 End If
1743                 If cSize / 1024 > 0 And cSize / 1024 < 1 Then
1744                     L4 = "<1KB"
1745                 ElseIf cSize = 0 Then
1746                     L4 = "0KB"
1747                 Else
1748                     L4 = CStr(Int(cSize / 1024)) + "KB"
1749                 End If
1750                 If fSize <> 0 Then
1751                     L3 = CStr(Int((1 - cSize / fSize) * 100)) + "%"
1752                 Else
1753                     L3 = "0%"
1754                 End If
1755                 fFlags = FileEntries(fNum).dwFlags
1756                 L6 = CStr(FileEntries(fNum).lcLocale)
1757                 If (fFlags And &H200) Or (fFlags And &H100) Then L5 = "C" Else L5 = "-"
1758                 If fFlags And &H10000 Then L5 = L5 + "E" Else L5 = L5 + "-"
1759                 If fFlags And &H20000 Then L5 = L5 + "X" Else L5 = L5 + "-"
1760         lIndex = 0
1761         On Error Resume Next
1762         lIndex = List.ListItems.Add(, , L1).Index
1763         On Error GoTo 0
1764         If lIndex = 0 Then
1765             lIndex = List.ListItems.Item(L1).Index
1766             List.ListItems.Item(L1).ListSubItems.Clear
1767         End If
1768         List.ListItems.Item(lIndex).Tag = L1
1769         List.ListItems.Item(lIndex).ListSubItems.Add(, , L2).Tag = fSize
1770             If fSize <> 0 Then
1771                 List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = Int((1 - cSize / fSize) * 100)
1772             Else
1773                 List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = 0
1774             End If
1775             List.ListItems.Item(lIndex).ListSubItems.Add(, , L4).Tag = cSize
1776             List.ListItems.Item(lIndex).ListSubItems.Add(, , L6).Tag = L6
1777             List.ListItems.Item(lIndex).ListSubItems.Add(, , L5).Tag = L5
1778     End If
1779     End If
1780 #If InternalListing Then
1781     End If
1782 #End If
1783     On Error Resume Next
1784     StatBar.SimpleText = "Building list... " + CStr(Int((fNum / UBound(FileEntries)) * 100)) + "% complete"
1785     On Error GoTo 0
1786 Next fNum
1787 SFileCloseArchive hMPQ
1788 List.Sorted = True
1789 '#If InternalListing Then
1790 RemoveDuplicates
1791 '#End If
1792 On Error Resume Next
1793 List.SelectedItem.Selected = False
1794 On Error GoTo 0
1795 SendMessageA List.hWnd, WM_SETREDRAW, 1, ByVal 0&
1796 ShowSelected
1797 ShowTotal
1798 NewFile = False
1799 mFilter = FileFilter
1800 FileOpened:
1801 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
1802 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1803 mnuMpq.Enabled = True
1804 For Each TItem In mnuTItem
1805     TItem.Enabled = True
1806 Next TItem
1807 Toolbar.Buttons.Item("Add").Enabled = True
1808 Toolbar.Buttons.Item("Add Folder").Enabled = True
1809 Toolbar.Buttons.Item("Extract").Enabled = True
1810 Toolbar.Buttons.Item("Compact").Enabled = True
1811 Toolbar.Buttons.Item("List").Enabled = True
1812 StatBar.Style = 0
1813 StatBar.SimpleText = ""
1814 If InStr(CD.FileName, "\") > 0 Then
1815     For bNum = 1 To Len(CD.FileName)
1816         If InStr(bNum, CD.FileName, "\") > 0 Then
1817             bNum = InStr(bNum, CD.FileName, "\")
1818         Else
1819             Exit For
1820         End If
1821     Next bNum
1822 End If
1823 Caption = "WinMPQ - " + Mid(CD.FileName, bNum)
1824 AddRecentFile CD.FileName
1825 MousePointer = 0
1826 End Sub
1828 Sub RemoveDuplicates()
1829 Dim fNum As Long
1830 fNum = 1
1831 Do While fNum <= List.ListItems.Count - 1
1832     If LCase(List.ListItems.Item(fNum).Tag) = LCase(List.ListItems.Item(fNum + 1).Tag) And List.ListItems.Item(fNum).ListSubItems(4).Tag = List.ListItems.Item(fNum + 1).ListSubItems(4).Tag Then
1833         List.ListItems.Remove (fNum)
1834         fNum = fNum - 1
1835     End If
1836     fNum = fNum + 1
1837 Loop
1838 End Sub
1839 Sub ShowSelected()
1840 Dim fNum As Long, nSelect As Long, sSize As Currency, fSize As Long, L2 As String, hMPQ As Long, hFile As Long
1841 On Error GoTo NotSelected
1842 List.SelectedItem.Tag = List.SelectedItem.Tag
1843 On Error GoTo 0
1844 On Error Resume Next
1845 For fNum = 1 To List.ListItems.Count
1846     If List.ListItems.Item(fNum).Selected Then
1847         nSelect = nSelect + 1
1848         If List.ListItems.Item(fNum).ListSubItems(1).Text <> "" Then
1849             sSize = sSize + List.ListItems.Item(fNum).ListSubItems(1).Tag
1850         Else
1851             If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
1852                 If SFileOpenFileEx(hMPQ, List.ListItems.Item(fNum).Tag, 0, hFile) Then
1853                     fSize = SFileGetFileSize(hFile, 0)
1854                     SFileCloseFile hFile
1855                 End If
1856                 SFileCloseArchive hMPQ
1857             End If
1858             If fSize / 1024 > 0 And fSize / 1024 < 1 Then
1859                 L2 = "<1KB"
1860             ElseIf fSize = 0 Then
1861                 L2 = "0KB"
1862             Else
1863                 L2 = CStr(Int(fSize / 1024)) + "KB"
1864             End If
1865             List.ListItems.Item(fNum).ListSubItems(1).Text = L2
1866             List.ListItems.Item(fNum).ListSubItems(1).Tag = fSize
1867             sSize = sSize + List.ListItems.Item(fNum).ListSubItems(1).Tag
1868         End If
1869     End If
1870 Next fNum
1871 If sSize / 1024 > 0 And sSize / 1024 < 1 Then
1872     StatBar.Panels.Item(1).Text = "Selected " + CStr(nSelect) + " files, <1KB"
1873 ElseIf sSize = 0 Then
1874     StatBar.Panels.Item(1).Text = "Selected " + CStr(nSelect) + " files, 0KB"
1875 Else
1876     StatBar.Panels.Item(1).Text = "Selected " + CStr(nSelect) + " files, " + CStr(Int(sSize / 1024)) + "KB"
1877 End If
1878 On Error GoTo 0
1879 Exit Sub
1880 NotSelected:
1881 StatBar.Panels.Item(1).Text = "Selected 0 files, 0KB"
1882 End Sub
1883 Sub ShowTotal()
1884 Dim fNum As Long, nFiles As Long, tSize As Currency
1885 On Error Resume Next
1886 For fNum = 1 To List.ListItems.Count
1887     nFiles = nFiles + 1
1888     If List.ListItems.Item(fNum).ListSubItems(1).Text <> "" Then
1889         tSize = tSize + List.ListItems.Item(fNum).ListSubItems(1).Tag
1890     End If
1891 Next fNum
1892 If tSize / 1024 > 0 And tSize / 1024 < 1 Then
1893     StatBar.Panels.Item(2).Text = "Total " + CStr(nFiles) + "/" + CStr(GetNumMpqFiles(CD.FileName)) + " files, <1KB"
1894 Else
1895     StatBar.Panels.Item(2).Text = "Total " + CStr(nFiles) + "/" + CStr(GetNumMpqFiles(CD.FileName)) + " files, " + CStr(Int(tSize / 1024)) + "KB"
1896 End If
1897 On Error GoTo 0
1898 End Sub
1899 Private Sub cmdGo_Click()
1900 StatBar.Style = 1
1901 RunMpq2kCommand txtCommand
1902 txtCommand = ""
1903 If StatBar.SimpleText = "" Then txtCommand_GotFocus
1904 End Sub
1906 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
1907 If KeyCode = vbKeyShift Then
1908     ShiftState = True
1909     BuildMpqActionList
1910 End If
1911 End Sub
1912 Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
1913 If KeyCode = vbKeyShift Then
1914     ShiftState = False
1915     BuildMpqActionList
1916 End If
1917 End Sub
1918 Private Sub Form_Load()
1919 Dim FileName As String, bNum As Long, CurPath As String, CurPath2 As String, CurPathType As Integer, sLine As String, Param() As String, pNum As Long, EndParam As Long, ParamCutout As String, OldStartPath As String, NewStartPath As String, ErrorText As String
1920 Dim Path
1921 Path = App.Path: If Right(Path, 1) <> "\" Then Path = Path + "\"
1922 NewKey AppKey
1923 SetReg AppKey + "InstallPath", GetLongPath(App.Path), REG_SZ
1924 SetReg AppKey + "ProgramFilename", GetLongPath(Path + App.EXEName + ".exe"), REG_SZ
1925 FixIcon hWnd, 1
1926 InitFileDialog CD
1927 CD.hwndOwner = hWnd
1928 CD.DefaultExt = "mpq"
1929 CD.MaxFileSize = 5120
1930 InitFolderDialog PathInput
1931 PathInput.hwndOwner = hWnd
1932 PathInput.Flags = BIF_RETURNONLYFSDIRS
1933 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
1934 ChDir App.Path
1935 'If Mpq.MpqInitialize = False Then
1936 '    ErrorText = "Mpq Control did not initialize properly!" + vbCrLf + "Reason:  "
1937 '    Select Case Mpq.LastError
1938 '    Case MPQ_ERROR_NO_STAREDIT
1939 '        ErrorText = ErrorText + "Can't find StarEdit.exe"
1940 '    Case MPQ_ERROR_BAD_STAREDIT
1941 '        ErrorText = ErrorText + "Wrong version of StarEdit.exe.  Need SC/BW 1.07"
1942 '    Case MPQ_ERROR_STAREDIT_RUNNING
1943 '        ErrorText = ErrorText + "StarEdit.exe is running.  It must be closed before running this"
1944 '    Case Else
1945 '        ErrorText = ErrorText + "Unknown"
1946 '    End Select
1947 '    MsgBox ErrorText
1948 '    End
1949 'End If
1950 ExtractPathNum = -1
1951 CopyPathNum = -1
1952 OldStartPath = CurDir
1953 CurPath = GetReg(AppKey + "StartupPath", CurDir)
1954 CurPathType = GetReg(AppKey + "StartupPathType", 0)
1955 If CurPathType < 0 Then CurPathType = 0
1956 If CurPathType > 2 Then CurPathType = 2
1957 If CurPathType = 1 Then
1958     CurPath = App.Path
1959 End If
1960 CurPath2 = CurPath
1961 If Right(CurPath2, 1) <> "\" Then CurPath2 = CurPath2 + "\"
1962 If IsDir(CurPath2) Then
1963     If Mid(CurPath, 2, 1) = ":" Then ChDrive Left(CurPath, 1)
1964     ChDir CurPath
1965 End If
1966 NewStartPath = CurDir
1967 On Error Resume Next
1968 Height = GetReg(AppKey + "Status\WindowHeight", Height)
1969 Left = GetReg(AppKey + "Status\WindowLeft", Left)
1970 Top = GetReg(AppKey + "Status\WindowTop", Top)
1971 Width = GetReg(AppKey + "Status\WindowWidth", Width)
1972 If GetReg(AppKey + "Status\WindowState", WindowState) = 2 Then WindowState = 2 Else WindowState = 0
1973 ListFile = GetReg(AppKey + "ListFile", Path + "mpq_data.txt")
1974 DefaultMaxFiles = GetReg(AppKey + "DefaultMaxFiles", 1024)
1975 DefaultBlockSize = GetReg(AppKey + "DefaultBlockSize", DEFAULT_BLOCK_SIZE)
1976 LocaleID = GetReg(AppKey + "LocaleID", 0)
1977 GlobalEncrypt = False
1978 DefaultCompressID = GetReg(AppKey + "DefaultCompress", -1)
1979 Select Case DefaultCompressID
1980 Case -3
1981 DefaultCompress = MAFA_COMPRESS_DEFLATE
1982 Case Else
1983 DefaultCompress = MAFA_COMPRESS_STANDARD
1984 End Select
1985 DefaultCompressLevel = GetReg(AppKey + "DefaultZlibLevel", Z_DEFAULT_COMPRESSION)
1986 BuildRecentFileList
1987 BuildToolsList
1988 On Error GoTo 0
1989 SFileSetLocale LocaleID
1990 ReDim GlobalFileList(0) As String
1991 #If InternalListing Then
1992 If FileExists(ListFile) Then
1993     Open ListFile For Input As #1
1994     Do While Not EOF(1)
1995         ReDim Preserve GlobalFileList(UBound(GlobalFileList) + 1) As String
1996         Line Input #1, GlobalFileList(UBound(GlobalFileList))
1997     Loop
1998     Close #1
1999 End If
2000 #End If
2001 FileName = Trim(Command)
2002 If Left(FileName, 1) = Chr(34) Then FileName = Mid(FileName, 2)
2003 If Right(FileName, 1) = Chr(34) Then FileName = Left(FileName, Len(FileName) - 1)
2004 FileName = Trim(FileName)
2005 If FileExists(FileName) Then
2006     CD.FileName = FileName
2007     Show
2008     OpenMpq
2009     Exit Sub
2010 End If
2011 ReDim FileList(0) As String
2012 If Right(CurPath, 1) <> "\" Then CurPath = CurPath + "\"
2013 sLine = Command
2014 If Right(sLine, 1) <> " " Then sLine = sLine + " "
2015 If sLine <> "" Then
2016     ReDim Param(0) As String
2017     For pNum = 1 To Len(sLine)
2018         If Mid(sLine, pNum, 1) = Chr(34) Then
2019             pNum = pNum + 1
2020             EndParam = InStr(pNum, sLine, Chr(34))
2021             If UBound(Param) = 1 Then ParamCutout = Mid(sLine, pNum - 1, (EndParam + 1) - (pNum - 1))
2022         Else
2023             EndParam = InStr(pNum, sLine, " ")
2024             If UBound(Param) = 1 Then ParamCutout = Mid(sLine, pNum, EndParam - pNum)
2025         End If
2026         If EndParam = 0 Then EndParam = Len(sLine) + 1
2027         If pNum <> EndParam Then
2028             If Trim(Mid(sLine, pNum, EndParam - pNum)) <> "" Then
2029                 ReDim Preserve Param(UBound(Param) + 1) As String
2030                 Param(UBound(Param)) = Trim(Mid(sLine, pNum, EndParam - pNum))
2031             End If
2032         End If
2033         pNum = EndParam
2034     Next pNum
2035     If UBound(Param) < 3 Then ReDim Preserve Param(3) As String
2036     Select Case LCase(Param(1))
2037     Case "o", "open", "n", "new"
2038         Show
2039         If Mid(OldStartPath, 2, 1) = ":" Then ChDrive Left(OldStartPath, 1)
2040         ChDir OldStartPath
2041         RunMpq2kCommand sLine
2042     Case "a", "add", "e", "extract", "r", "ren", "rename", "m", "move", "d", "del", "delete", "f", "flush", "compact", "l", "list"
2043         If Mid(OldStartPath, 2, 1) = ":" Then ChDrive Left(OldStartPath, 1)
2044         ChDir OldStartPath
2045         CD.FileName = FullPath(CurDir, Param(2))
2046         sLine = Left(sLine, InStr(sLine, ParamCutout) - 1) + Mid(sLine, InStr(sLine, ParamCutout) + Len(ParamCutout))
2047         RunMpq2kCommand sLine
2048         If Mid(NewStartPath, 2, 1) = ":" Then ChDrive Left(NewStartPath, 1)
2049         ChDir NewStartPath
2050         Unload Me
2051     Case "s", "script"
2052         Show
2053         If Mid(OldStartPath, 2, 1) = ":" Then ChDrive Left(OldStartPath, 1)
2054         ChDir OldStartPath
2055         RunMpq2kCommand sLine
2056         If Mid(NewStartPath, 2, 1) = ":" Then ChDrive Left(NewStartPath, 1)
2057         ChDir NewStartPath
2058     End Select
2059 End If
2060 End Sub
2061 Private Sub Form_Resize()
2062 On Error Resume Next
2063 If WindowState <> 1 Then
2064     List.Top = Toolbar.Height
2065     List.Width = ScaleWidth
2066     List.Height = ScaleHeight - List.Top - StatBar.Height - txtCommand.Height
2067     Label1.Top = List.Top + List.Height + (txtCommand.Height - Label1.Height) / 2
2068     txtCommand.Top = List.Top + List.Height
2069     txtCommand.Left = Label1.Width
2070     txtCommand.Width = ScaleWidth - cmdGo.Width - Label1.Width
2071     cmdGo.Top = txtCommand.Top
2072     cmdGo.Left = txtCommand.Left + txtCommand.Width
2073     mFilter.Left = Toolbar.Buttons.Item("filterspace").Left
2074     mFilter.Width = ScaleWidth - mFilter.Left - Toolbar.Buttons.Item("List").Width
2075     Toolbar.Buttons.Item("filterspace").Width = mFilter.Width
2076 End If
2077 End Sub
2078 Private Sub Form_Unload(Cancel As Integer)
2079 Dim Path As String
2080 Path = App.Path
2081 If Right(Path, 1) <> "\" Then Path = Path + "\"
2082 On Error Resume Next
2083 If ExtractPathNum > -1 Then
2084     KillEx Path + "Temp_extract\" + CStr(ExtractPathNum) + "\", "*", 6, True
2085     RmDir Path + "Temp_extract\" + CStr(ExtractPathNum) + "\"
2086 End If
2087 If DirEx(Path + "Temp_extract\", "*", 6, True) = "" Or App.PrevInstance = False Then
2088     KillEx Path + "Temp_extract\", "*", 6, True
2089     RmDir Path + "Temp_extract\"
2090 End If
2091 If CopyPathNum > -1 Then
2092     KillEx Path + "Temp_copy\" + CStr(CopyPathNum) + "\", "*", 6, True
2093     RmDir Path + "Temp_copy\" + CStr(CopyPathNum) + "\"
2094 End If
2095 If DirEx(Path + "Temp_copy\", "*", 6, True) = "" Or App.PrevInstance = False Then
2096     KillEx Path + "Temp_copy\", "*", 6, True
2097     RmDir Path + "Temp_copy\"
2098 End If
2099 If GetReg(AppKey + "SaveWindowStatus", 1) > 0 Then
2100     NewKey AppKey
2101     NewKey AppKey + "Status\"
2102     If WindowState = 1 Then WindowState = 0
2103     SetReg AppKey + "Status\WindowState", WindowState, REG_DWORD
2104     WindowState = 0
2105     SetReg AppKey + "Status\WindowHeight", Height, REG_DWORD
2106     SetReg AppKey + "Status\WindowLeft", Left, REG_DWORD
2107     SetReg AppKey + "Status\WindowTop", Top, REG_DWORD
2108     SetReg AppKey + "Status\WindowWidth", Width, REG_DWORD
2109 End If
2110 If GetReg(AppKey + "StartupPathType", 0) <= 0 Then
2111     SetReg AppKey + "StartupPath", CurDir
2112 End If
2113 End
2114 End Sub
2115 Private Sub Label1_Click()
2116 txtCommand.SetFocus
2117 End Sub
2118 Private Sub List_AfterLabelEdit(Cancel As Integer, NewString As String)
2119 Dim result As Long, hMPQ As Long, hFile As Long
2120 If List.SelectedItem.Text <> NewString Then
2121     If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
2122         result = vbYes
2123     Else
2124         result = MsgBox("Rename file?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
2125     End If
2126     If result = vbYes Then
2127         List.SelectedItem.Tag = NewString
2128         hMPQ = mOpenMpq(CD.FileName)
2129         If hMPQ Then
2130             If SFileOpenFileEx(hMPQ, NewString, 0, hFile) Then
2131                 SFileCloseFile hFile
2132                 SFileSetLocale List.SelectedItem.ListSubItems(4).Tag
2133                 MpqDeleteFile hMPQ, NewString
2134                 MpqRenameFile hMPQ, List.SelectedItem.Text, NewString
2135                 SFileSetLocale LocaleID
2136                 RemoveDuplicates
2137             Else
2138                 SFileSetLocale List.SelectedItem.ListSubItems(4).Tag
2139                 MpqRenameFile hMPQ, List.SelectedItem.Text, NewString
2140                 SFileSetLocale LocaleID
2141             End If
2142             MpqCloseUpdatedArchive hMPQ, 0
2143             On Error Resume Next
2144             List.SelectedItem.Key = NewString
2145             On Error GoTo 0
2146             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2147         End If
2148     Else
2149         Cancel = True
2150     End If
2151 End If
2152 ShowSelected
2153 End Sub
2154 Private Sub List_Click()
2155 On Error GoTo NotSelected
2156 List.SelectedItem.Tag = List.SelectedItem.Tag
2157 On Error GoTo NotClick
2158 List.HitTest(CX, CY).Tag = List.HitTest(CX, CY).Tag
2159 On Error GoTo 0
2160 ShowSelected
2161 Exit Sub
2162 NotClick:
2163 List.SelectedItem.Selected = False
2164 NotSelected:
2165 ShowSelected
2166 BuildMpqActionList
2167 End Sub
2168 Private Sub List_ColumnClick(ByVal ColumnHeader As ColumnHeader)
2169 If List.SortKey = ColumnHeader.Index - 1 Then
2170     If List.SortOrder = 0 Then
2171         List.SortOrder = 1
2172     Else
2173         List.SortOrder = 0
2174     End If
2175 Else
2176     List.SortOrder = 0
2177     List.SortKey = ColumnHeader.Index - 1
2178 End If
2179 End Sub
2180 Private Sub List_DblClick()
2181 Dim fNum As Long, Path As String, fName As String, fName2 As String, bNum As Long, AlreadyInList As Boolean, hMPQ As Long
2182 On Error GoTo NotSelected
2183 List.SelectedItem.Tag = List.SelectedItem.Tag
2184 On Error GoTo NotClick
2185 List.HitTest(CX, CY).Tag = List.HitTest(CX, CY).Tag
2186 On Error GoTo 0
2187 Path = App.Path
2188 If Right(Path, 1) <> "\" Then Path = Path + "\"
2189 Path = Path + "Temp_extract\"
2190 If ExtractPathNum = -1 Then
2191     fNum = 0
2192     Do
2193     If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
2194     fNum = fNum + 1
2195     Loop
2196     ExtractPathNum = fNum
2197 End If
2198 Path = Path + CStr(ExtractPathNum) + "\"
2199 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2200 For fNum = 1 To List.ListItems.Count
2201     If List.ListItems.Item(fNum).Selected Then
2202         StatBar.Style = 1
2203         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2204         MousePointer = 11
2205         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2206         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2207         SFileSetLocale LocaleID
2208         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then
2209             For bNum = 1 To UBound(OpenFiles)
2210                 If LCase(OpenFiles(bNum)) = LCase(List.ListItems.Item(fNum).Tag) Then
2211                     AlreadyInList = True
2212                     If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(bNum) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
2213                     Exit For
2214                 End If
2215             Next bNum
2216             If AlreadyInList = False Then
2217                 ReDim Preserve OpenFiles(UBound(OpenFiles) + 1) As String, OpenFileDates(UBound(OpenFileDates) + 1) As Date
2218                 OpenFiles(UBound(OpenFiles)) = List.ListItems.Item(fNum).Tag
2219                 If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(UBound(OpenFileDates)) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
2220             End If
2221         End If
2222         StatBar.Style = 1
2223         StatBar.SimpleText = "Opening " + List.ListItems.Item(fNum).Tag + "..."
2224         fName = List.ListItems.Item(fNum).Tag
2225         BuildPopup Path + fName, 0, mnuPopup, mnuPItem
2226         ExecuteFile Path + fName, 0, mnuPopup, mnuPItem
2227         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then Timer1.Enabled = True
2228     End If
2229 Next fNum
2230 SFileCloseArchive hMPQ
2231 StatBar.Style = 0
2232 StatBar.SimpleText = ""
2233 MousePointer = 0
2234 Exit Sub
2235 NotClick:
2236 List.SelectedItem.Selected = False
2237 NotSelected:
2238 End Sub
2239 Private Sub List_ItemClick(ByVal Item As ListItem)
2240 BuildMpqActionList
2241 End Sub
2242 Private Sub List_KeyPress(KeyAscii As Integer)
2243 If KeyAscii = 13 Then List_DblClick
2244 End Sub
2245 Private Sub List_KeyUp(KeyCode As Integer, Shift As Integer)
2246 If KeyCode = vbKeyDelete Then
2247     mnuMDelete_Click
2248 ElseIf KeyCode = 93 Or ((Shift And vbShiftMask) And KeyCode = vbKeyF10) Then
2249     On Error GoTo NotSelected
2250     List.SelectedItem.Tag = List.SelectedItem.Tag
2251     On Error GoTo 0
2252     If List.SelectedItem.Selected = True Then
2253         BuildPopup List.SelectedItem.Tag, Shift, mnuPopup, mnuPItem
2254         PopupMenu mnuPopup, vbPopupMenuRightButton, List.Left + List.SelectedItem.Left + 12 * Screen.TwipsPerPixelX, List.Top + List.SelectedItem.Top + 16 * Screen.TwipsPerPixelY, mnuPItem(0)
2255     End If
2256 End If
2257 NotSelected:
2258 End Sub
2259 Private Sub List_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
2260 CX = X
2261 CY = Y
2262 If Button And vbRightButton Then
2263     On Error GoTo NotSelected
2264     List.SelectedItem.Tag = List.SelectedItem.Tag
2265     On Error GoTo NotClick
2266     List.HitTest(CX, CY).Tag = List.HitTest(CX, CY).Tag
2267     On Error GoTo 0
2268     BuildPopup List.SelectedItem.Tag, Shift, mnuPopup, mnuPItem
2269     PopupMenu mnuPopup, vbPopupMenuRightButton, , , mnuPItem(0)
2270 End If
2271 NotClick:
2272 NotSelected:
2273 End Sub
2274 Private Sub List_OLECompleteDrag(Effect As Long)
2275 List.Tag = ""
2276 End Sub
2277 Private Sub List_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
2278 Dim Files() As String, ShortFiles() As String, bNum As Long, fNum As Long, Path As String, FolderFiles As String, Path2 As String, cNum As Long, FileFilter As String
2279 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, fSize As Long, cSize As Long, fFlags As Long, hMPQ As Long, dwFlags As Long
2280 If Data.GetFormat(ccCFFiles) <> True Then Exit Sub
2281 For fNum = 1 To Data.Files.Count
2282     Path = Data.Files.Item(fNum)
2283     If Right(Path, 1) <> "\" Then Path = Path + "\"
2284     If IsDir(Path) Then
2285         Path = Path + "*"
2286         Data.Files.Remove fNum
2287         Data.Files.Add Path, fNum
2288     End If
2289 Next fNum
2290 Path = Data.Files.Item(1)
2291 For bNum = 1 To Len(Path)
2292     If InStr(bNum, Path, "\") > 0 Then
2293         For fNum = 1 To Data.Files.Count
2294             If Left(Data.Files.Item(fNum), InStr(bNum, Path, "\")) <> Left(Path, InStr(bNum, Path, "\")) Then GoTo PathFound
2295         Next fNum
2296         bNum = InStr(bNum, Path, "\")
2297     Else
2298         Exit For
2299     End If
2300 Next bNum
2301 PathFound:
2302 Path = Left(Path, bNum - 1)
2303 ReDim Files(0) As String
2304 Files(0) = Path
2305 If Right(Path, 1) <> "\" Then Path = Path + "\"
2306 ReDim Preserve Files(Data.Files.Count) As String
2307 For bNum = 1 To Data.Files.Count
2308     Files(bNum) = Mid(Data.Files.Item(bNum), 1 + Len(Path))
2309     For fNum = 1 To Len(Files(bNum))
2310         If InStr(fNum, Files(bNum), "\") > 0 Then
2311             fNum = InStr(fNum, Files(bNum), "\")
2312         Else
2313             Exit For
2314         End If
2315     Next fNum
2316     FolderFiles = FolderFiles + DirEx(Path + Left(Files(bNum), fNum - 1), Mid(Files(bNum), fNum), 6, True)
2317 Next bNum
2318 If FolderFiles = "" Then Exit Sub
2319 ReDim Preserve Files(0) As String
2320 For bNum = 1 To Len(FolderFiles)
2321     ReDim Preserve Files(UBound(Files) + 1) As String
2322     If InStr(bNum, FolderFiles, vbCrLf) > 0 Then
2323         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path), InStr(bNum, FolderFiles, vbCrLf) - bNum - Len(Path))
2324         bNum = InStr(bNum, FolderFiles, vbCrLf) + 1
2325     Else
2326         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path))
2327         Exit For
2328     End If
2329 Next bNum
2330 FoldName.Show 1
2331 If AddFolderName = Chr(0) + Chr(255) + Chr(127) + Chr(128) Then GoTo Cancel
2332 If UBound(Files) > 1 Then
2333     ReDim ShortFiles(UBound(Files)) As String
2334     For bNum = 0 To UBound(Files)
2335         ShortFiles(bNum) = AddFolderName + Files(bNum)
2336     Next bNum
2337     If Right(Files(0), 1) <> "\" Then Files(0) = Files(0) + "\"
2338     For bNum = 1 To UBound(Files)
2339         Files(bNum) = FullPath(Files(0), Files(bNum))
2340     Next bNum
2341 Else
2342     For bNum = 1 To Len(Files(1))
2343         If InStr(bNum, Files(1), "\") > 0 Then
2344             bNum = InStr(bNum, Files(1), "\")
2345         Else
2346             Exit For
2347         End If
2348     Next bNum
2349     ReDim ShortFiles(UBound(Files)) As String
2350     ShortFiles(1) = AddFolderName + Mid(Files(1), bNum)
2351     Files(1) = FullPath(Files(0), Files(1))
2352 End If
2353 If NewFile = True Then
2354     If FileExists(CD.FileName) Then Kill CD.FileName
2355     NewFile = False
2356 End If
2357 List.Sorted = False
2358 FileFilter = mFilter
2359 hMPQ = mOpenMpq(CD.FileName)
2360 If hMPQ = 0 Then
2361     StatBar.SimpleText = "Can't create archive " + CD.FileName
2362     Exit Sub
2363 End If
2364 dwFlags = MAFA_REPLACE_EXISTING
2365 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
2366 For bNum = 1 To UBound(Files)
2367     StatBar.Style = 1
2368     StatBar.SimpleText = "Adding " + Files(bNum) + "..."
2369     MousePointer = 11
2370     If mnuMCNone.Checked Then
2371         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags, 0, 0
2372     ElseIf mnuMCStandard.Checked Then
2373         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
2374     ElseIf mnuMCDeflate.Checked Then
2375         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
2376     ElseIf mnuMCAMedium.Checked Then
2377         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 0
2378     ElseIf mnuMCAHighest.Checked Then
2379         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 1
2380     ElseIf mnuMCALowest.Checked Then
2381         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 2
2382     ElseIf mnuMCAuto.Checked Then
2383         mAddAutoFile hMPQ, Files(bNum), ShortFiles(bNum)
2384     End If
2385     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2386     mFilter.AddItem "*" + GetExtension(ShortFiles(bNum))
2387     For cNum = 1 To mFilter.ListCount - 1
2388         If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
2389             mFilter.RemoveItem cNum
2390             Exit For
2391         End If
2392     Next cNum
2393 Next bNum
2394 MpqCloseUpdatedArchive hMPQ, 0
2395 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2396 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
2397     StatBar.SimpleText = "Adding files to listing... 0% complete"
2398     For bNum = 1 To UBound(Files)
2399         If MatchesFilter(ShortFiles(bNum), FileFilter) Then
2400             MpqAddToListing hMPQ, ShortFiles(bNum)
2401         End If
2402         On Error Resume Next
2403         StatBar.SimpleText = "Adding files to listing... " + CStr(Int((bNum / UBound(Files)) * 100)) + "% complete"
2404         On Error GoTo 0
2405     Next bNum
2406     SFileCloseArchive hMPQ
2407 End If
2408 StatBar.Style = 0
2409 StatBar.SimpleText = ""
2410 MousePointer = 0
2411 If MatchesFilter("(listfile)", FileFilter) Then
2412     AddToListing "(listfile)"
2413 End If
2414 mFilter = FileFilter
2415 List.Sorted = True
2416 RemoveDuplicates
2417 ShowTotal
2418 Cancel:
2419 End Sub
2420 Private Sub List_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
2421 If CD.FileName = "" Or Data.GetFormat(ccCFFiles) <> True Or List.Tag = "WinMPQ" Then
2422     Effect = ccOLEDropEffectNone
2423 Else
2424     Effect = ccOLEDropEffectCopy
2425 End If
2426 End Sub
2427 Private Sub List_OLESetData(Data As MSComctlLib.DataObject, DataFormat As Integer)
2428 Dim fNum As Long, Path As String, fCount As Long, FirstFile As String, hMPQ As Long
2429 Path = App.Path
2430 If Right(Path, 1) <> "\" Then Path = Path + "\"
2431 Path = Path + "Temp_copy\"
2432 If CopyPathNum = -1 Then
2433     fNum = 0
2434     Do
2435     If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
2436     fNum = fNum + 1
2437     Loop
2438     CopyPathNum = fNum
2439 End If
2440 Path = Path + CStr(CopyPathNum) + "\"
2441 KillEx Path, "*", 6, True
2442 fCount = 0
2443 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2444 For fNum = 1 To List.ListItems.Count
2445     If List.ListItems.Item(fNum).Selected Then
2446         StatBar.Style = 1
2447         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2448         MousePointer = 11
2449         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2450         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2451         SFileSetLocale LocaleID
2452         If GetReg(AppKey + "UseDragDropWildcards", 1) = 0 Then
2453             Data.Files.Add Path + List.ListItems.Item(fNum).Tag
2454         End If
2455         fCount = fCount + 1
2456         If fCount = 1 Then FirstFile = Path + List.ListItems.Item(fNum).Tag
2457     End If
2458 Next fNum
2459 SFileCloseArchive hMPQ
2460 StatBar.Style = 0
2461 StatBar.SimpleText = ""
2462 MousePointer = 0
2463 If GetReg(AppKey + "UseDragDropWildcards", 1) <> 0 And fCount > 1 Then
2464     Data.Files.Add Path + "*"
2465 ElseIf fCount = 1 Then
2466     Data.Files.Add FirstFile
2467 End If
2468 End Sub
2469 Private Sub List_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)
2470 Data.SetData , ccCFFiles
2471 AllowedEffects = ccOLEDropEffectCopy
2472 List.Tag = "WinMPQ"
2473 End Sub
2474 Private Sub mFilter_KeyPress(KeyAscii As Integer)
2475 If KeyAscii = 13 And Toolbar.Buttons.Item("List").Enabled Then
2476     If NewFile = False Then OpenMpq
2477 End If
2478 End Sub
2479 Private Sub mnuFExit_Click()
2480 Unload Me
2481 End Sub
2482 Private Sub mnuFile_Click()
2483 If FileExists(CD.FileName) Then mnuFReopen.Enabled = True Else mnuFReopen.Enabled = False
2484 End Sub
2485 Private Sub mnuFRecent_Click(Index As Integer)
2486 Dim OldFileName As String
2487 OldFileName = CD.FileName
2488 CD.FileName = mnuFRecent(Index).Tag
2489 If FileExists(CD.FileName) = False Then
2490     CD.FileName = OldFileName
2491     MsgBox "The file " + Chr(34) + mnuFRecent(Index).Tag + Chr(34) + " does not exist.", vbExclamation, "WinMPQ"
2492     DelRecentFile mnuFRecent(Index).Tag
2493     Exit Sub
2494 End If
2495 OpenMpq
2496 If CD.FileName = "" Then
2497     CD.FileName = OldFileName
2498     DelRecentFile mnuFRecent(Index).Tag
2499 End If
2500 End Sub
2501 Private Sub mnuFReopen_Click()
2502 OpenMpq
2503 End Sub
2505 Private Sub mnuFScript_Click()
2506 Dim OldFileName As String, OldPath As String
2507 CD.Flags = &H1000 Or &H4 Or &H2
2508 CD.Filter = "All Files (*.*)|*.*"
2509 OldFileName = CD.FileName
2510 OldPath = CurDir
2511 CD.hwndOwner = hWnd
2512 If ShowOpen(CD) = False Then GoTo Cancel
2513 StatBar.Style = 1
2514 StatBar.SimpleText = "Running script " + CD.FileName + "..."
2515 MousePointer = 11
2516 RunScript CD.FileName
2517 StatBar.Style = 0
2518 StatBar.SimpleText = ""
2519 MousePointer = 0
2520 CD.FileName = OldFileName
2521 Cancel:
2522 If Mid(OldPath, 2, 1) = ":" Then ChDrive Left(OldPath, 1)
2523 ChDir OldPath
2524 End Sub
2525 Private Sub mnuHAbout_Click()
2526 About.Show 1
2527 End Sub
2528 Private Sub mnuHReadme_Click()
2529 Dim Path As String
2530 Path = App.Path
2531 If Right(Path, 1) <> "\" Then Path = Path + "\"
2532 If FileExists(Path + "WinMPQ.rtf") Then
2533     ShellExecute hWnd, vbNullString, Path + "WinMPQ.rtf", vbNullString, vbNullString, 1
2534 Else
2535     MsgBox "Could not find WinMPQ.rtf!", vbCritical, "WinMPQ"
2536 End If
2537 End Sub
2538 Private Sub mnuMAdd_Click()
2539 Dim Files() As String, ShortFiles() As String, bNum As Long, OldFileName As String, fNum As Long, cNum As Long, FileFilter As String
2540 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, fSize As Long, cSize As Long, fFlags As Long, hMPQ As Long, dwFlags As Long
2541 CD.Flags = OFN_EXPLORER Or &H1000 Or &H200 Or &H4 Or &H2
2542 CD.Filter = "All Files (*.*)|*.*"
2543 OldFileName = CD.FileName
2544 CD.hwndOwner = hWnd
2545 If ShowOpen(CD) = False Then GoTo Cancel
2546 ReDim Files(0) As String
2547 bNum = 1
2548 If InStr(1, CD.FileName, Chr(0)) > 0 Then
2549     Files(0) = Mid(CD.FileName, 1, InStr(1, CD.FileName, Chr(0)) - 1)
2550     bNum = InStr(1, CD.FileName, Chr(0)) + 1
2551 Else
2552     Files(0) = Mid(CD.FileName, 1)
2553 End If
2554 For bNum = bNum To Len(CD.FileName)
2555     ReDim Preserve Files(UBound(Files) + 1) As String
2556     If InStr(bNum, CD.FileName, Chr(0)) > 0 Then
2557         Files(UBound(Files)) = Mid(CD.FileName, bNum, InStr(bNum, CD.FileName, Chr(0)) - bNum)
2558         bNum = InStr(bNum, CD.FileName, Chr(0))
2559     Else
2560         Files(UBound(Files)) = Mid(CD.FileName, bNum)
2561         Exit For
2562     End If
2563 Next bNum
2564 CD.FileName = OldFileName
2565 FoldName.Show 1
2566 If AddFolderName = Chr(0) + Chr(255) + Chr(127) + Chr(128) Then GoTo Cancel
2567 If UBound(Files) > 1 Then
2568     ReDim ShortFiles(UBound(Files)) As String
2569     For bNum = 0 To UBound(Files)
2570         ShortFiles(bNum) = AddFolderName + Files(bNum)
2571     Next bNum
2572     If Right(Files(0), 1) <> "\" Then Files(0) = Files(0) + "\"
2573     For bNum = 1 To UBound(Files)
2574         Files(bNum) = FullPath(Files(0), Files(bNum))
2575     Next bNum
2576 Else
2577     For bNum = 1 To Len(Files(1))
2578         If InStr(bNum, Files(1), "\") > 0 Then
2579             bNum = InStr(bNum, Files(1), "\")
2580         Else
2581             Exit For
2582         End If
2583     Next bNum
2584     ReDim ShortFiles(UBound(Files)) As String
2585     ShortFiles(1) = AddFolderName + Mid(Files(1), bNum)
2586     Files(1) = FullPath(Files(0), Files(1))
2587 End If
2588 If NewFile = True Then
2589     If FileExists(CD.FileName) Then Kill CD.FileName
2590     NewFile = False
2591 End If
2592 List.Sorted = False
2593 FileFilter = mFilter
2594 hMPQ = mOpenMpq(CD.FileName)
2595 If hMPQ = 0 Then
2596     StatBar.SimpleText = "Can't create archive " + CD.FileName
2597     Exit Sub
2598 End If
2599 dwFlags = MAFA_REPLACE_EXISTING
2600 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
2601 For bNum = 1 To UBound(Files)
2602     StatBar.Style = 1
2603     StatBar.SimpleText = "Adding " + Files(bNum) + "..."
2604     MousePointer = 11
2605     If mnuMCNone.Checked Then
2606         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags, 0, 0
2607     ElseIf mnuMCStandard.Checked Then
2608         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
2609     ElseIf mnuMCDeflate.Checked Then
2610         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
2611     ElseIf mnuMCAMedium.Checked Then
2612         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 0
2613     ElseIf mnuMCAHighest.Checked Then
2614         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 1
2615     ElseIf mnuMCALowest.Checked Then
2616         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 2
2617     ElseIf mnuMCAuto.Checked Then
2618         mAddAutoFile hMPQ, Files(bNum), ShortFiles(bNum)
2619     End If
2620     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2621     mFilter.AddItem "*" + GetExtension(ShortFiles(bNum))
2622     For cNum = 1 To mFilter.ListCount - 1
2623         If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
2624             mFilter.RemoveItem cNum
2625             Exit For
2626         End If
2627     Next cNum
2628 Next bNum
2629 MpqCloseUpdatedArchive hMPQ, 0
2630 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2631 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
2632     StatBar.SimpleText = "Adding files to listing... 0% complete"
2633     For bNum = 1 To UBound(Files)
2634         If MatchesFilter(ShortFiles(bNum), FileFilter) Then
2635             MpqAddToListing hMPQ, ShortFiles(bNum)
2636         End If
2637         On Error Resume Next
2638         StatBar.SimpleText = "Adding files to listing... " + CStr(Int((bNum / UBound(Files)) * 100)) + "% complete"
2639         On Error GoTo 0
2640     Next bNum
2641     SFileCloseArchive hMPQ
2642 End If
2643 StatBar.Style = 0
2644 StatBar.SimpleText = ""
2645 MousePointer = 0
2646 If MatchesFilter("(listfile)", FileFilter) Then
2647     AddToListing "(listfile)"
2648 End If
2649 mFilter = FileFilter
2650 List.Sorted = True
2651 RemoveDuplicates
2652 ShowTotal
2653 Cancel:
2654 End Sub
2655 Private Sub mnuMAddFolder_Click()
2656 Dim Files() As String, ShortFiles() As String, bNum As Long, fNum As Long, Path As String, FolderFiles As String, cNum As Long, FileFilter As String, hMPQ As Long
2657 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, fSize As Long, cSize As Long, fFlags As Long, dwFlags As Long
2658 PathInput.hwndOwner = hWnd
2659 Path = PathInputBox(PathInput, "Folder to add files from...", CurDir)
2660 If Path = "" Then GoTo Cancel
2661 FolderFiles = DirEx(Path, "*", 6, True)
2662 If FolderFiles = "" Then Exit Sub
2663 ReDim Files(0) As String
2664 Files(0) = Path
2665 If Right(Path, 1) <> "\" Then Path = Path + "\"
2666 For bNum = 1 To Len(FolderFiles)
2667     ReDim Preserve Files(UBound(Files) + 1) As String
2668     If InStr(bNum, FolderFiles, vbCrLf) > 0 Then
2669         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path), InStr(bNum, FolderFiles, vbCrLf) - bNum - Len(Path))
2670         bNum = InStr(bNum, FolderFiles, vbCrLf) + 1
2671     Else
2672         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path))
2673         Exit For
2674     End If
2675 Next bNum
2676 FoldName.Show 1
2677 If AddFolderName = Chr(0) + Chr(255) + Chr(127) + Chr(128) Then GoTo Cancel
2678 If UBound(Files) > 1 Then
2679     ReDim ShortFiles(UBound(Files)) As String
2680     For bNum = 0 To UBound(Files)
2681         ShortFiles(bNum) = AddFolderName + Files(bNum)
2682     Next bNum
2683     If Right(Files(0), 1) <> "\" Then Files(0) = Files(0) + "\"
2684     For bNum = 1 To UBound(Files)
2685         Files(bNum) = FullPath(Files(0), Files(bNum))
2686     Next bNum
2687 Else
2688     For bNum = 1 To Len(Files(1))
2689         If InStr(bNum, Files(1), "\") > 0 Then
2690             bNum = InStr(bNum, Files(1), "\")
2691         Else
2692             Exit For
2693         End If
2694     Next bNum
2695     ReDim ShortFiles(UBound(Files)) As String
2696     ShortFiles(1) = AddFolderName + Mid(Files(1), bNum)
2697     Files(1) = FullPath(Files(0), Files(1))
2698 End If
2699 If NewFile = True Then
2700     If FileExists(CD.FileName) Then Kill CD.FileName
2701     NewFile = False
2702 End If
2703 List.Sorted = False
2704 FileFilter = mFilter
2705 hMPQ = mOpenMpq(CD.FileName)
2706 If hMPQ = 0 Then
2707     StatBar.SimpleText = "Can't create archive " + CD.FileName
2708     Exit Sub
2709 End If
2710 dwFlags = MAFA_REPLACE_EXISTING
2711 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
2712 For bNum = 1 To UBound(Files)
2713     StatBar.Style = 1
2714     StatBar.SimpleText = "Adding " + Files(bNum) + "..."
2715     MousePointer = 11
2716     If mnuMCNone.Checked Then
2717         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags, 0, 0
2718     ElseIf mnuMCStandard.Checked Then
2719         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
2720     ElseIf mnuMCDeflate.Checked Then
2721         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
2722     ElseIf mnuMCAMedium.Checked Then
2723         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 0
2724     ElseIf mnuMCAHighest.Checked Then
2725         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 1
2726     ElseIf mnuMCALowest.Checked Then
2727         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 2
2728     ElseIf mnuMCAuto.Checked Then
2729         mAddAutoFile hMPQ, Files(bNum), ShortFiles(bNum)
2730     End If
2731     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2732     mFilter.AddItem "*" + GetExtension(ShortFiles(bNum))
2733     For cNum = 1 To mFilter.ListCount - 1
2734         If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
2735             mFilter.RemoveItem cNum
2736             Exit For
2737         End If
2738     Next cNum
2739 Next bNum
2740 MpqCloseUpdatedArchive hMPQ, 0
2741 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2742 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
2743     StatBar.SimpleText = "Adding files to listing... 0% complete"
2744     For bNum = 1 To UBound(Files)
2745         If MatchesFilter(ShortFiles(bNum), FileFilter) Then
2746             MpqAddToListing hMPQ, ShortFiles(bNum)
2747         End If
2748         On Error Resume Next
2749         StatBar.SimpleText = "Adding files to listing... " + CStr(Int((bNum / UBound(Files)) * 100)) + "% complete"
2750         On Error GoTo 0
2751     Next bNum
2752     SFileCloseArchive hMPQ
2753 End If
2754 StatBar.Style = 0
2755 StatBar.SimpleText = ""
2756 MousePointer = 0
2757 If MatchesFilter("(listfile)", FileFilter) Then
2758     AddToListing "(listfile)"
2759 End If
2760 mFilter = FileFilter
2761 List.Sorted = True
2762 RemoveDuplicates
2763 ShowTotal
2764 Cancel:
2765 End Sub
2767 Private Sub mnuMAddToList_Click()
2768 frmAddToList.Show 1
2769 End Sub
2770 Private Sub mnuMCAHighest_Click()
2771 mnuMCNone.Checked = False
2772 mnuMCStandard.Checked = False
2773 mnuMCDeflate.Checked = False
2774 mnuMCALowest.Checked = False
2775 mnuMCAMedium.Checked = False
2776 mnuMCAHighest.Checked = True
2777 mnuMCAuto.Checked = False
2778 End Sub
2779 Private Sub mnuMCALowest_Click()
2780 mnuMCNone.Checked = False
2781 mnuMCStandard.Checked = False
2782 mnuMCDeflate.Checked = False
2783 mnuMCALowest.Checked = True
2784 mnuMCAMedium.Checked = False
2785 mnuMCAHighest.Checked = False
2786 mnuMCAuto.Checked = False
2787 End Sub
2790 Private Sub mnuMCAMedium_Click()
2791 mnuMCNone.Checked = False
2792 mnuMCStandard.Checked = False
2793 mnuMCDeflate.Checked = False
2794 mnuMCALowest.Checked = False
2795 mnuMCAMedium.Checked = True
2796 mnuMCAHighest.Checked = False
2797 mnuMCAuto.Checked = False
2798 End Sub
2799 Private Sub mnuMCAuto_Click()
2800 mnuMCNone.Checked = False
2801 mnuMCStandard.Checked = False
2802 mnuMCDeflate.Checked = False
2803 mnuMCALowest.Checked = False
2804 mnuMCAMedium.Checked = False
2805 mnuMCAHighest.Checked = False
2806 mnuMCAuto.Checked = True
2807 End Sub
2809 Private Sub mnuMCDeflate_Click()
2810 mnuMCNone.Checked = False
2811 mnuMCStandard.Checked = False
2812 mnuMCDeflate.Checked = True
2813 mnuMCALowest.Checked = False
2814 mnuMCAMedium.Checked = False
2815 mnuMCAHighest.Checked = False
2816 mnuMCAuto.Checked = False
2817 End Sub
2820 Private Sub mnuMChLCID_Click()
2821 Dim fNum As Long
2822 On Error GoTo NotSelected
2823 List.SelectedItem.Tag = List.SelectedItem.Tag
2824 On Error GoTo 0
2825 For fNum = 1 To List.ListItems.Count
2826     If List.ListItems.Item(fNum).Selected Then
2827         GoTo FileSelected
2828     End If
2829 Next fNum
2830 GoTo NotSelected
2831 FileSelected:
2832 ChLCID.Show 1
2833 Exit Sub
2834 NotSelected:
2835 MsgBox "No files are selected.", , "WinMPQ"
2836 End Sub
2837 Private Sub mnuMCNone_Click()
2838 mnuMCNone.Checked = True
2839 mnuMCStandard.Checked = False
2840 mnuMCDeflate.Checked = False
2841 mnuMCALowest.Checked = False
2842 mnuMCAMedium.Checked = False
2843 mnuMCAHighest.Checked = False
2844 mnuMCAuto.Checked = False
2845 End Sub
2846 Private Sub mnuMCompact_Click()
2847 Dim fNum As Long, result As Long, hMPQ As Long
2848 If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
2849     result = vbYes
2850 Else
2851     result = MsgBox("Uncompressed files with an 'X' in the attributes column and are not" + vbCrLf + "listed in (listfile) may be corrupted or deleted by the compacting process." + vbCrLf + "(Note:  These files are fairly rare)  Continue with compact?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
2852 End If
2853 If result = vbYes Then
2854     StatBar.Style = 1
2855     StatBar.SimpleText = "Compacting " + CD.FileName + "..."
2856     MousePointer = 11
2857     hMPQ = mOpenMpq(CD.FileName)
2858     If hMPQ Then
2859         MpqCompactArchive hMPQ
2860         MpqCloseUpdatedArchive hMPQ, 0
2861     End If
2862     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2863     StatBar.Style = 0
2864     StatBar.SimpleText = ""
2865     MousePointer = 0
2866     OpenMpq
2867 End If
2868 End Sub
2869 Private Sub mnuMCStandard_Click()
2870 mnuMCNone.Checked = False
2871 mnuMCStandard.Checked = True
2872 mnuMCDeflate.Checked = False
2873 mnuMCALowest.Checked = False
2874 mnuMCAMedium.Checked = False
2875 mnuMCAHighest.Checked = False
2876 mnuMCAuto.Checked = False
2877 End Sub
2878 Private Sub mnuMDelete_Click()
2879 Dim fNum As Long, result As Long, hMPQ As Long
2880 On Error GoTo NotSelected
2881 List.SelectedItem.Tag = List.SelectedItem.Tag
2882 On Error GoTo 0
2883 For fNum = 1 To List.ListItems.Count
2884     If List.ListItems.Item(fNum).Selected Then
2885         GoTo FileSelected
2886     End If
2887 Next fNum
2888 GoTo NotSelected
2889 FileSelected:
2890     If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
2891         result = vbYes
2892     Else
2893         result = MsgBox("Delete file(s)?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
2894     End If
2895     If result = vbYes Then
2896         fNum = 1
2897         hMPQ = mOpenMpq(CD.FileName)
2898         If hMPQ Then
2899             Do While fNum <= List.ListItems.Count
2900                 If List.ListItems.Item(fNum).Selected Then
2901                     StatBar.Style = 1
2902                     StatBar.SimpleText = "Deleting " + List.ListItems.Item(fNum).Tag + "..."
2903                     MousePointer = 11
2904                     SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2905                     MpqDeleteFile hMPQ, List.ListItems.Item(fNum).Tag
2906                     SFileSetLocale LocaleID
2907                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2908                     List.ListItems.Remove (fNum)
2909                     fNum = fNum - 1
2910                 End If
2911                 fNum = fNum + 1
2912             Loop
2913             MpqCloseUpdatedArchive hMPQ, 0
2914         End If
2915     End If
2916     StatBar.Style = 0
2917     StatBar.SimpleText = ""
2918     MousePointer = 0
2919     ShowSelected
2920     ShowTotal
2921 Exit Sub
2922 NotSelected:
2923 MsgBox "No files are selected.", , "WinMPQ"
2924 End Sub
2925 Private Sub mnuMEncrypt_Click()
2926 If mnuMEncrypt.Checked = False Then
2927     mnuMEncrypt.Checked = True
2928     GlobalEncrypt = True
2929 Else
2930     mnuMEncrypt.Checked = False
2931     GlobalEncrypt = False
2932 End If
2933 End Sub
2934 Private Sub mnuMExtract_Click()
2935 Dim fNum As Long, Path As String, result As Long, hMPQ As Long
2936 On Error GoTo NotSelected
2937 List.SelectedItem.Tag = List.SelectedItem.Tag
2938 On Error GoTo 0
2939 For fNum = 1 To List.ListItems.Count
2940     If List.ListItems.Item(fNum).Selected Then
2941         GoTo FileSelected
2942     End If
2943 Next fNum
2944 GoTo NotSelected
2945 FileSelected:
2946 PathInput.hwndOwner = hWnd
2947 Path = PathInputBox(PathInput, "Extract file(s) to...", CurDir)
2948 If Path = "" Then Exit Sub
2949 If Right(Path, 1) <> "\" Then Path = Path + "\"
2950 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2951 For fNum = 1 To List.ListItems.Count
2952     If List.ListItems.Item(fNum).Selected Then
2953         StatBar.Style = 1
2954         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2955         MousePointer = 11
2956         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2957         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2958         SFileSetLocale LocaleID
2959     End If
2960 Next fNum
2961 SFileCloseArchive hMPQ
2962 StatBar.Style = 0
2963 StatBar.SimpleText = ""
2964 MousePointer = 0
2965 Exit Sub
2966 NotSelected:
2967 If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
2968     result = vbYes
2969 Else
2970     result = MsgBox("No files are selected." + vbCrLf + "Extract all listed files?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
2971 End If
2972 If result = vbYes Then
2973     PathInput.hwndOwner = hWnd
2974     Path = PathInputBox(PathInput, "Extract file(s) to...", CurDir)
2975     If Path = "" Then Exit Sub
2976     If Right(Path, 1) <> "\" Then Path = Path + "\"
2977     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2978     For fNum = 1 To List.ListItems.Count
2979         StatBar.Style = 1
2980         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2981         MousePointer = 11
2982         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2983         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2984         SFileSetLocale LocaleID
2985     Next fNum
2986     SFileCloseArchive hMPQ
2987     StatBar.Style = 0
2988     StatBar.SimpleText = ""
2989     MousePointer = 0
2990 End If
2991 End Sub
2992 Private Sub mnuFNew_Click()
2993 Dim TItem As Menu
2994 CD.Flags = &H1000 Or &H4 Or &H2
2995 CD.DefaultExt = "mpq"
2996 CD.Filter = "Mpq Archives (*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m;*.w3x)|*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m;*.w3x|All Files (*.*)|*.*"
2997 CD.hwndOwner = hWnd
2998 If ShowSave(CD) = False Then GoTo Cancel
2999 ReDim FileList(0) As String
3000 List.ListItems.Clear
3001 ShowSelected
3002 ShowTotal
3003 NewFile = True
3004 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
3005 mnuMpq.Enabled = True
3006 For Each TItem In mnuTItem
3007     TItem.Enabled = True
3008 Next TItem
3009 Toolbar.Buttons.Item("Add").Enabled = True
3010 Toolbar.Buttons.Item("Add Folder").Enabled = True
3011 Toolbar.Buttons.Item("Extract").Enabled = True
3012 Toolbar.Buttons.Item("Compact").Enabled = True
3013 Toolbar.Buttons.Item("List").Enabled = True
3014 Caption = "WinMPQ - " + CD.FileTitle
3015 AddRecentFile CD.FileName
3016 Cancel:
3017 End Sub
3018 Private Sub mnuFOpen_Click()
3019 Dim OldFileName As String
3020 CD.Flags = &H1000 Or &H4 Or &H2
3021 CD.Filter = "All Archives|*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m;*.w3x;*.cwd|Mpq Archives (*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m;*.w3x)|*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m;*.w3x|Cwad Archives (*.cwd;*.exe)|*.cwd;*.exe|All Files (*.*)|*.*"
3022 OldFileName = CD.FileName
3023 CD.hwndOwner = hWnd
3024 If ShowOpen(CD) = False Then GoTo Cancel
3025 OpenMpq
3026 If CD.FileName = "" Then CD.FileName = OldFileName
3027 Cancel:
3028 End Sub
3029 Private Sub mnuMItem_Click(Index As Integer)
3030 FileActionClick mnuMpq, mnuMItem, Index
3031 End Sub
3032 Private Sub mnuMRename_Click()
3033 List.StartLabelEdit
3034 End Sub
3035 Private Sub mnuMSaveList_Click()
3036 Dim fNum As Long, fList As String, OldFileName As String
3037 CD.Flags = &H1000 Or &H4 Or &H2
3038 CD.DefaultExt = "txt"
3039 CD.Filter = "Text File (*.txt)|*.txt|All Files (*.*)|*.*"
3040 OldFileName = CD.FileName
3041 CD.FileName = CD.FileName + ".txt"
3042 CD.hwndOwner = hWnd
3043 If ShowSave(CD) = False Then GoTo Cancel
3044 StatBar.Style = 1
3045 StatBar.SimpleText = "Creating list..."
3046 MousePointer = 11
3047 For fNum = 1 To List.ListItems.Count
3048     fList = fList + List.ListItems.Item(fNum).Tag + vbCrLf
3049 Next fNum
3050 fNum = FreeFile
3051 Open CD.FileName For Binary As #fNum
3052 Put #fNum, 1, fList
3053 Close #fNum
3054 Cancel:
3055 CD.FileName = OldFileName
3056 StatBar.Style = 0
3057 StatBar.SimpleText = ""
3058 MousePointer = 0
3059 End Sub
3060 Private Sub mnuOptions_Click()
3061 Options.Show 1
3062 End Sub
3064 Private Sub mnuPChLCID_Click()
3065 mnuMChLCID_Click
3066 End Sub
3067 Private Sub mnuPDelete_Click()
3068 mnuMDelete_Click
3069 End Sub
3070 Private Sub mnuPExtract_Click()
3071 mnuMExtract_Click
3072 End Sub
3073 Private Sub mnuPItem_Click(Index As Integer)
3074 FileActionClick mnuPopup, mnuPItem, Index
3075 End Sub
3076 Private Sub mnuPRename_Click()
3077 mnuMRename_Click
3078 End Sub
3079 Private Sub mnuPTItem_Click(Index As Integer)
3080 mnuTItem_Click Index
3081 End Sub
3082 Private Sub mnuTAdd_Click()
3083 ToolList.Show 1
3084 BuildToolsList
3085 End Sub
3086 Private Sub mnuTItem_Click(Index As Integer)
3087 Dim Param As String, bNum As Long, FileName As String, Path As String, fNum As Long, AlreadyInList As Boolean, UseFile As Boolean, NewParam As String, FileNameList As String, hMPQ As Long
3088 Param = mnuTItem(Index).Tag
3089 On Error GoTo NoProgram
3090 If Param = "" Then Err.Raise 53
3091 On Error GoTo 0
3092 Do
3093     If InStr(1, Param, "%mpq", 1) Then
3094         bNum = InStr(1, Param, "%mpq", 1)
3095         Param = Left(Param, bNum - 1) + CD.FileName + Mid(Param, bNum + 4)
3096     End If
3097 Loop While InStr(1, Param, "%mpq", 1)
3098 NewParam = Param
3099 On Error GoTo NotSelected
3100 List.SelectedItem.Tag = List.SelectedItem.Tag
3101 On Error GoTo 0
3102 If List.SelectedItem.Selected Then FileName = List.SelectedItem.Tag
3103 NotSelected:
3104 If FileName <> "" And (InStr(Param, "%1") Or (InStr(Param, "%1") = 0 And InStr(1, mnuTItem(Index).Tag, "%mpq", 1) = 0)) Then
3105     Path = App.Path
3106     If Right(Path, 1) <> "\" Then Path = Path + "\"
3107     Path = Path + "Temp_extract\"
3108     If ExtractPathNum = -1 Then
3109         fNum = 0
3110         Do
3111         If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
3112         fNum = fNum + 1
3113         Loop
3114         ExtractPathNum = fNum
3115     End If
3116     Path = Path + CStr(ExtractPathNum) + "\"
3117     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
3118     For fNum = 1 To List.ListItems.Count
3119         If List.ListItems.Item(fNum).Selected Then
3120             StatBar.Style = 1
3121             StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
3122             MousePointer = 11
3123             SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
3124             sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
3125             SFileSetLocale LocaleID
3126             If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then
3127                 For bNum = 1 To UBound(OpenFiles)
3128                     If LCase(OpenFiles(bNum)) = LCase(List.ListItems.Item(fNum).Tag) Then
3129                         AlreadyInList = True
3130                         If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(bNum) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
3131                         Exit For
3132                     End If
3133                 Next bNum
3134                 If AlreadyInList = False Then
3135                     ReDim Preserve OpenFiles(UBound(OpenFiles) + 1) As String, OpenFileDates(UBound(OpenFileDates) + 1) As Date
3136                     OpenFiles(UBound(OpenFiles)) = List.ListItems.Item(fNum).Tag
3137                     If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(UBound(OpenFileDates)) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
3138                 End If
3139             End If
3140             StatBar.Style = 1
3141             StatBar.SimpleText = "Opening " + List.ListItems.Item(fNum).Tag + "..."
3142             FileName = FullPath(Path, List.ListItems.Item(fNum).Tag)
3143             UseFile = True
3144             Param = NewParam
3145             Do
3146                 If InStr(Param, "%1") = 0 And InStr(1, mnuTItem(Index).Tag, "%mpq", 1) = 0 Then
3147                     If FileName <> "" Then
3148                         Param = Param + " " + FileName
3149                     End If
3150                 ElseIf InStr(Param, Chr(34) + "%1" + Chr(34)) Then
3151                     bNum = InStr(Param, Chr(34) + "%1" + Chr(34))
3152                     If FileName <> "" Then
3153                         Param = Left(Param, bNum - 1) + Chr(34) + FileName + Chr(34) + Mid(Param, bNum + 4)
3154                     Else
3155                         Param = Left(Param, bNum - 1) + Mid(Param, bNum + 4)
3156                     End If
3157                 ElseIf InStr(Param, "%1") Then
3158                     bNum = InStr(Param, "%1")
3159                     If FileName <> "" Then
3160                         Param = Left(Param, bNum - 1) + FileName + Mid(Param, bNum + 2)
3161                     Else
3162                         Param = Left(Param, bNum - 1) + Mid(Param, bNum + 2)
3163                     End If
3164                 End If
3165             Loop While InStr(Param, "%1")
3166             On Error GoTo NoProgram
3167             Shell Param, 1
3168             On Error GoTo 0
3169             If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then Timer1.Enabled = True
3170         End If
3171     Next fNum
3172     SFileCloseArchive hMPQ
3173 ElseIf InStr(1, mnuTItem(Index).Tag, "%mpq", 1) Then
3174     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
3175     On Error GoTo NoProgram
3176     Shell Param, 1
3177     On Error GoTo 0
3178     Timer1.Enabled = True
3179 Else
3180     MsgBox "No files are selected.", , "WinMPQ"
3181 End If
3182 If FileName <> "" Then
3183     StatBar.Style = 0
3184     StatBar.SimpleText = ""
3185     MousePointer = 0
3186 End If
3187 Exit Sub
3188 NoProgram:
3189 If Err.Number = 53 Then MsgBox "No program is assigned for this action.", , "WinMPQ"
3190 End Sub
3192 Private Sub mnuTMpqEmbed_Click()
3193 frmMpq.Show
3194 End Sub
3195 Private Sub Timer1_Timer()
3196 Dim fNum As Long, Path As String, result As Long, bNum As Long, hMPQ As Long, dwFlags As Long
3197 If Screen.ActiveForm.Name <> "MpqEx" Then Exit Sub
3198 Path = App.Path
3199 If Right(Path, 1) <> "\" Then Path = Path + "\"
3200 Path = Path + "Temp_extract\"
3201 Path = Path + CStr(ExtractPathNum) + "\"
3202 For fNum = 1 To UBound(OpenFiles)
3203     If FileExists(FullPath(Path, OpenFiles(fNum))) Then
3204         If FileDateTime(FullPath(Path, OpenFiles(fNum))) > OpenFileDates(fNum) Then
3205             If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
3206                 result = vbYes
3207             Else
3208             result = MsgBox("File " + OpenFiles(fNum) + " has been changed since it was extracted." + vbCrLf + vbCrLf + "Update archive with this file?", vbYesNo Or vbInformation, "WinMPQ")
3209             End If
3210             If FileExists(FullPath(Path, OpenFiles(fNum))) Then
3211                 OpenFileDates(fNum) = FileDateTime(FullPath(Path, OpenFiles(fNum)))
3212                 If result = vbYes Then
3213                     List.Sorted = False
3214                     StatBar.Style = 1
3215                     StatBar.SimpleText = "Adding " + OpenFiles(fNum) + "..."
3216                     MousePointer = 11
3217                     dwFlags = MAFA_REPLACE_EXISTING
3218                     If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
3219                     hMPQ = mOpenMpq(CD.FileName)
3220                     If hMPQ Then
3221                         If mnuMCNone.Checked Then
3222                             MpqAddFileToArchiveEx hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags, 0, 0
3223                         ElseIf mnuMCStandard.Checked Then
3224                             MpqAddFileToArchiveEx hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
3225                         ElseIf mnuMCDeflate.Checked Then
3226                             MpqAddFileToArchiveEx hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
3227                         ElseIf mnuMCAMedium.Checked Then
3228                             MpqAddWaveToArchive hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, 0
3229                         ElseIf mnuMCAHighest.Checked Then
3230                             MpqAddWaveToArchive hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, 1
3231                         ElseIf mnuMCALowest.Checked Then
3232                             MpqAddWaveToArchive hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, 2
3233                         ElseIf mnuMCAuto.Checked Then
3234                             mAddAutoFile hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum)
3235                         End If
3236                     End If
3237                     MpqAddToListing hMPQ, OpenFiles(fNum)
3238                     MpqCloseUpdatedArchive hMPQ, 0
3239                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
3240                     StatBar.Style = 0
3241                     StatBar.SimpleText = ""
3242                     MousePointer = 0
3243                     List.Sorted = True
3244                     RemoveDuplicates
3245                     ShowTotal
3246                 End If
3247             End If
3248         End If
3249     Else
3250         For bNum = fNum To UBound(OpenFiles) - 1
3251             OpenFiles(bNum) = OpenFiles(bNum + 1)
3252             OpenFileDates(bNum) = OpenFileDates(bNum + 1)
3253         Next bNum
3254         ReDim Preserve OpenFiles(UBound(OpenFiles) - 1) As String, OpenFileDates(UBound(OpenFileDates) - 1) As Date
3255         fNum = fNum - 1
3256         If UBound(OpenFiles) = 0 Then Timer1.Enabled = False
3257     End If
3258     If fNum >= UBound(OpenFiles) Then Exit For
3259 Next fNum
3260 If FileExists(CD.FileName) Then
3261     If FileDateTime(CD.FileName) <> MpqDate And NewFile = False Then OpenMpq
3262 Else
3263     OpenMpq
3264 End If
3265 End Sub
3266 Private Sub Toolbar_ButtonClick(ByVal Button As Button)
3267 Select Case Button.Key
3268 Case "New"
3269     mnuFNew_Click
3270 Case "Open"
3271     mnuFOpen_Click
3272 Case "Add"
3273     mnuMAdd_Click
3274 Case "Add Folder"
3275     mnuMAddFolder_Click
3276 Case "Extract"
3277     mnuMExtract_Click
3278 Case "Compact"
3279     mnuMCompact_Click
3280 Case "List"
3281     If NewFile = False Then OpenMpq
3282 End Select
3283 End Sub
3284 Private Sub txtCommand_GotFocus()
3285 cmdGo.Default = True
3286 txtCommandHasFocus = True
3287 StatBar.Style = 1
3288 StatBar.SimpleText = "Current directory: " + Chr(34) + CurDir + Chr(34)
3289 End Sub
3290 Private Sub txtCommand_LostFocus()
3291 cmdGo.Default = False
3292 txtCommandHasFocus = False
3293 StatBar.Style = 0
3294 StatBar.SimpleText = ""
3295 End Sub