WIP: Updated project to build for Apple Silicon, and updated included version of libunrar. haven't looked into how to compile the lib to include both platforms. (Commented out Growl for the moment as Framework doesn\t have aarm symbols yet)
This commit is contained in:
		
							parent
							
								
									d4aea239c6
								
							
						
					
					
						commit
						619cdeee73
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
#include "GrowlDefines.h"
 | 
					#include <Growl/GrowlDefines.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __OBJC__
 | 
					#ifdef __OBJC__
 | 
				
			||||||
#	include "GrowlApplicationBridge.h"
 | 
					#	include <Growl/GrowlApplicationBridge.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#include "GrowlApplicationBridge-Carbon.h"
 | 
					#include <Growl/GrowlApplicationBridge-Carbon.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										759
									
								
								PasswordView.xib
								
								
								
								
							
							
						
						
									
										759
									
								
								PasswordView.xib
								
								
								
								
							| 
						 | 
					@ -1,715 +1,46 @@
 | 
				
			||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 | 
					<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17132.0.2" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
 | 
				
			||||||
	<data>
 | 
					    <dependencies>
 | 
				
			||||||
		<int key="IBDocument.SystemTarget">1060</int>
 | 
					        <deployment identifier="macosx"/>
 | 
				
			||||||
		<string key="IBDocument.SystemVersion">10C540</string>
 | 
					        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17132.0.2"/>
 | 
				
			||||||
		<string key="IBDocument.InterfaceBuilderVersion">740</string>
 | 
					        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
 | 
				
			||||||
		<string key="IBDocument.AppKitVersion">1038.25</string>
 | 
					    </dependencies>
 | 
				
			||||||
		<string key="IBDocument.HIToolboxVersion">458.00</string>
 | 
					    <objects>
 | 
				
			||||||
		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 | 
					        <customObject id="-2" userLabel="File's Owner" customClass="QuietUnrarAppDelegate">
 | 
				
			||||||
			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
 | 
					            <connections>
 | 
				
			||||||
			<string key="NS.object.0">740</string>
 | 
					                <outlet property="passwordField" destination="5" id="15"/>
 | 
				
			||||||
		</object>
 | 
					                <outlet property="passwordView" destination="1" id="14"/>
 | 
				
			||||||
		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 | 
					            </connections>
 | 
				
			||||||
			<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					        </customObject>
 | 
				
			||||||
			<integer value="1"/>
 | 
					        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
 | 
				
			||||||
		</object>
 | 
					        <customObject id="-3" userLabel="Application"/>
 | 
				
			||||||
		<object class="NSArray" key="IBDocument.PluginDependencies">
 | 
					        <customView id="1">
 | 
				
			||||||
			<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					            <rect key="frame" x="0.0" y="0.0" width="273" height="22"/>
 | 
				
			||||||
			<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 | 
					            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
 | 
				
			||||||
		</object>
 | 
					            <subviews>
 | 
				
			||||||
		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 | 
					                <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4">
 | 
				
			||||||
			<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					                    <rect key="frame" x="-3" y="2" width="64" height="17"/>
 | 
				
			||||||
			<object class="NSArray" key="dict.sortedKeys" id="0">
 | 
					                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Password" id="9">
 | 
				
			||||||
			</object>
 | 
					                        <font key="font" metaFont="system"/>
 | 
				
			||||||
			<object class="NSMutableArray" key="dict.values">
 | 
					                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					                        <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
 | 
				
			||||||
			</object>
 | 
					                    </textFieldCell>
 | 
				
			||||||
		</object>
 | 
					                </textField>
 | 
				
			||||||
		<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
 | 
					                <secureTextField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5">
 | 
				
			||||||
			<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					                    <rect key="frame" x="66" y="0.0" width="207" height="22"/>
 | 
				
			||||||
			<object class="NSCustomObject" id="1001">
 | 
					                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
 | 
				
			||||||
				<string key="NSClassName">QuietUnrarAppDelegate</string>
 | 
					                    <secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="8">
 | 
				
			||||||
			</object>
 | 
					                        <font key="font" metaFont="system"/>
 | 
				
			||||||
			<object class="NSCustomObject" id="1003">
 | 
					                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
 | 
				
			||||||
				<string key="NSClassName">FirstResponder</string>
 | 
					                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
 | 
				
			||||||
			</object>
 | 
					                        <allowedInputSourceLocales>
 | 
				
			||||||
			<object class="NSCustomObject" id="1004">
 | 
					                            <string>NSAllRomanInputSourcesLocaleIdentifier</string>
 | 
				
			||||||
				<string key="NSClassName">NSApplication</string>
 | 
					                        </allowedInputSourceLocales>
 | 
				
			||||||
			</object>
 | 
					                    </secureTextFieldCell>
 | 
				
			||||||
			<object class="NSCustomView" id="1005">
 | 
					                </secureTextField>
 | 
				
			||||||
				<reference key="NSNextResponder"/>
 | 
					            </subviews>
 | 
				
			||||||
				<int key="NSvFlags">268</int>
 | 
					            <point key="canvasLocation" x="140" y="154"/>
 | 
				
			||||||
				<object class="NSMutableArray" key="NSSubviews">
 | 
					        </customView>
 | 
				
			||||||
					<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					    </objects>
 | 
				
			||||||
					<object class="NSSecureTextField" id="612576048">
 | 
					</document>
 | 
				
			||||||
						<reference key="NSNextResponder" ref="1005"/>
 | 
					 | 
				
			||||||
						<int key="NSvFlags">268</int>
 | 
					 | 
				
			||||||
						<string key="NSFrame">{{66, 0}, {207, 22}}</string>
 | 
					 | 
				
			||||||
						<reference key="NSSuperview" ref="1005"/>
 | 
					 | 
				
			||||||
						<bool key="NSEnabled">YES</bool>
 | 
					 | 
				
			||||||
						<object class="NSSecureTextFieldCell" key="NSCell" id="156987241">
 | 
					 | 
				
			||||||
							<int key="NSCellFlags">343014976</int>
 | 
					 | 
				
			||||||
							<int key="NSCellFlags2">272630848</int>
 | 
					 | 
				
			||||||
							<string key="NSContents"/>
 | 
					 | 
				
			||||||
							<object class="NSFont" key="NSSupport" id="1039893584">
 | 
					 | 
				
			||||||
								<string key="NSName">LucidaGrande</string>
 | 
					 | 
				
			||||||
								<double key="NSSize">13</double>
 | 
					 | 
				
			||||||
								<int key="NSfFlags">1044</int>
 | 
					 | 
				
			||||||
							</object>
 | 
					 | 
				
			||||||
							<reference key="NSControlView" ref="612576048"/>
 | 
					 | 
				
			||||||
							<bool key="NSDrawsBackground">YES</bool>
 | 
					 | 
				
			||||||
							<object class="NSColor" key="NSBackgroundColor">
 | 
					 | 
				
			||||||
								<int key="NSColorSpace">6</int>
 | 
					 | 
				
			||||||
								<string key="NSCatalogName">System</string>
 | 
					 | 
				
			||||||
								<string key="NSColorName">textBackgroundColor</string>
 | 
					 | 
				
			||||||
								<object class="NSColor" key="NSColor">
 | 
					 | 
				
			||||||
									<int key="NSColorSpace">3</int>
 | 
					 | 
				
			||||||
									<bytes key="NSWhite">MQA</bytes>
 | 
					 | 
				
			||||||
								</object>
 | 
					 | 
				
			||||||
							</object>
 | 
					 | 
				
			||||||
							<object class="NSColor" key="NSTextColor">
 | 
					 | 
				
			||||||
								<int key="NSColorSpace">6</int>
 | 
					 | 
				
			||||||
								<string key="NSCatalogName">System</string>
 | 
					 | 
				
			||||||
								<string key="NSColorName">textColor</string>
 | 
					 | 
				
			||||||
								<object class="NSColor" key="NSColor" id="856066844">
 | 
					 | 
				
			||||||
									<int key="NSColorSpace">3</int>
 | 
					 | 
				
			||||||
									<bytes key="NSWhite">MAA</bytes>
 | 
					 | 
				
			||||||
								</object>
 | 
					 | 
				
			||||||
							</object>
 | 
					 | 
				
			||||||
							<object class="NSArray" key="NSAllowedInputLocales">
 | 
					 | 
				
			||||||
								<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
								<string>NSAllRomanInputSourcesLocaleIdentifier</string>
 | 
					 | 
				
			||||||
							</object>
 | 
					 | 
				
			||||||
						</object>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="NSTextField" id="882838287">
 | 
					 | 
				
			||||||
						<reference key="NSNextResponder" ref="1005"/>
 | 
					 | 
				
			||||||
						<int key="NSvFlags">268</int>
 | 
					 | 
				
			||||||
						<string key="NSFrame">{{-3, 2}, {64, 17}}</string>
 | 
					 | 
				
			||||||
						<reference key="NSSuperview" ref="1005"/>
 | 
					 | 
				
			||||||
						<bool key="NSEnabled">YES</bool>
 | 
					 | 
				
			||||||
						<object class="NSTextFieldCell" key="NSCell" id="707825159">
 | 
					 | 
				
			||||||
							<int key="NSCellFlags">68288064</int>
 | 
					 | 
				
			||||||
							<int key="NSCellFlags2">272630784</int>
 | 
					 | 
				
			||||||
							<string key="NSContents">Password</string>
 | 
					 | 
				
			||||||
							<reference key="NSSupport" ref="1039893584"/>
 | 
					 | 
				
			||||||
							<reference key="NSControlView" ref="882838287"/>
 | 
					 | 
				
			||||||
							<object class="NSColor" key="NSBackgroundColor">
 | 
					 | 
				
			||||||
								<int key="NSColorSpace">6</int>
 | 
					 | 
				
			||||||
								<string key="NSCatalogName">System</string>
 | 
					 | 
				
			||||||
								<string key="NSColorName">controlColor</string>
 | 
					 | 
				
			||||||
								<object class="NSColor" key="NSColor">
 | 
					 | 
				
			||||||
									<int key="NSColorSpace">3</int>
 | 
					 | 
				
			||||||
									<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
 | 
					 | 
				
			||||||
								</object>
 | 
					 | 
				
			||||||
							</object>
 | 
					 | 
				
			||||||
							<object class="NSColor" key="NSTextColor">
 | 
					 | 
				
			||||||
								<int key="NSColorSpace">6</int>
 | 
					 | 
				
			||||||
								<string key="NSCatalogName">System</string>
 | 
					 | 
				
			||||||
								<string key="NSColorName">controlTextColor</string>
 | 
					 | 
				
			||||||
								<reference key="NSColor" ref="856066844"/>
 | 
					 | 
				
			||||||
							</object>
 | 
					 | 
				
			||||||
						</object>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<string key="NSFrameSize">{273, 22}</string>
 | 
					 | 
				
			||||||
				<reference key="NSSuperview"/>
 | 
					 | 
				
			||||||
				<string key="NSClassName">NSView</string>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
		</object>
 | 
					 | 
				
			||||||
		<object class="IBObjectContainer" key="IBDocument.Objects">
 | 
					 | 
				
			||||||
			<object class="NSMutableArray" key="connectionRecords">
 | 
					 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				<object class="IBConnectionRecord">
 | 
					 | 
				
			||||||
					<object class="IBOutletConnection" key="connection">
 | 
					 | 
				
			||||||
						<string key="label">passwordView</string>
 | 
					 | 
				
			||||||
						<reference key="source" ref="1001"/>
 | 
					 | 
				
			||||||
						<reference key="destination" ref="1005"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<int key="connectionID">14</int>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBConnectionRecord">
 | 
					 | 
				
			||||||
					<object class="IBOutletConnection" key="connection">
 | 
					 | 
				
			||||||
						<string key="label">passwordField</string>
 | 
					 | 
				
			||||||
						<reference key="source" ref="1001"/>
 | 
					 | 
				
			||||||
						<reference key="destination" ref="612576048"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<int key="connectionID">15</int>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
			<object class="IBMutableOrderedSet" key="objectRecords">
 | 
					 | 
				
			||||||
				<object class="NSArray" key="orderedObjects">
 | 
					 | 
				
			||||||
					<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">0</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="0"/>
 | 
					 | 
				
			||||||
						<reference key="children" ref="1000"/>
 | 
					 | 
				
			||||||
						<nil key="parent"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">-2</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="1001"/>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="0"/>
 | 
					 | 
				
			||||||
						<string key="objectName">File's Owner</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">-1</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="1003"/>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="0"/>
 | 
					 | 
				
			||||||
						<string key="objectName">First Responder</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">-3</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="1004"/>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="0"/>
 | 
					 | 
				
			||||||
						<string key="objectName">Application</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">1</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="1005"/>
 | 
					 | 
				
			||||||
						<object class="NSMutableArray" key="children">
 | 
					 | 
				
			||||||
							<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
							<reference ref="882838287"/>
 | 
					 | 
				
			||||||
							<reference ref="612576048"/>
 | 
					 | 
				
			||||||
						</object>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="0"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">4</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="882838287"/>
 | 
					 | 
				
			||||||
						<object class="NSMutableArray" key="children">
 | 
					 | 
				
			||||||
							<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
							<reference ref="707825159"/>
 | 
					 | 
				
			||||||
						</object>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="1005"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">5</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="612576048"/>
 | 
					 | 
				
			||||||
						<object class="NSMutableArray" key="children">
 | 
					 | 
				
			||||||
							<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
							<reference ref="156987241"/>
 | 
					 | 
				
			||||||
						</object>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="1005"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">8</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="156987241"/>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="612576048"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBObjectRecord">
 | 
					 | 
				
			||||||
						<int key="objectID">9</int>
 | 
					 | 
				
			||||||
						<reference key="object" ref="707825159"/>
 | 
					 | 
				
			||||||
						<reference key="parent" ref="882838287"/>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
			<object class="NSMutableDictionary" key="flattenedProperties">
 | 
					 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				<object class="NSArray" key="dict.sortedKeys">
 | 
					 | 
				
			||||||
					<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
					<string>1.IBEditorWindowLastContentRect</string>
 | 
					 | 
				
			||||||
					<string>1.IBPluginDependency</string>
 | 
					 | 
				
			||||||
					<string>1.WindowOrigin</string>
 | 
					 | 
				
			||||||
					<string>1.editorWindowContentRectSynchronizationRect</string>
 | 
					 | 
				
			||||||
					<string>4.IBPluginDependency</string>
 | 
					 | 
				
			||||||
					<string>5.IBPluginDependency</string>
 | 
					 | 
				
			||||||
					<string>8.IBPluginDependency</string>
 | 
					 | 
				
			||||||
					<string>9.IBPluginDependency</string>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="NSMutableArray" key="dict.values">
 | 
					 | 
				
			||||||
					<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
					<string>{{414, 718}, {273, 22}}</string>
 | 
					 | 
				
			||||||
					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 | 
					 | 
				
			||||||
					<string>{628, 654}</string>
 | 
					 | 
				
			||||||
					<string>{{217, 442}, {480, 272}}</string>
 | 
					 | 
				
			||||||
					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 | 
					 | 
				
			||||||
					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 | 
					 | 
				
			||||||
					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 | 
					 | 
				
			||||||
					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
			<object class="NSMutableDictionary" key="unlocalizedProperties">
 | 
					 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				<reference key="dict.sortedKeys" ref="0"/>
 | 
					 | 
				
			||||||
				<object class="NSMutableArray" key="dict.values">
 | 
					 | 
				
			||||||
					<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
			<nil key="activeLocalization"/>
 | 
					 | 
				
			||||||
			<object class="NSMutableDictionary" key="localizations">
 | 
					 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				<reference key="dict.sortedKeys" ref="0"/>
 | 
					 | 
				
			||||||
				<object class="NSMutableArray" key="dict.values">
 | 
					 | 
				
			||||||
					<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
			<nil key="sourceID"/>
 | 
					 | 
				
			||||||
			<int key="maxID">15</int>
 | 
					 | 
				
			||||||
		</object>
 | 
					 | 
				
			||||||
		<object class="IBClassDescriber" key="IBDocument.Classes">
 | 
					 | 
				
			||||||
			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
 | 
					 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">QuietUnrarAppDelegate</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="NSMutableDictionary" key="outlets">
 | 
					 | 
				
			||||||
						<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
						<object class="NSArray" key="dict.sortedKeys">
 | 
					 | 
				
			||||||
							<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
							<string>passwordField</string>
 | 
					 | 
				
			||||||
							<string>passwordView</string>
 | 
					 | 
				
			||||||
							<string>window</string>
 | 
					 | 
				
			||||||
						</object>
 | 
					 | 
				
			||||||
						<object class="NSMutableArray" key="dict.values">
 | 
					 | 
				
			||||||
							<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
							<string>NSSecureTextField</string>
 | 
					 | 
				
			||||||
							<string>NSView</string>
 | 
					 | 
				
			||||||
							<string>NSWindow</string>
 | 
					 | 
				
			||||||
						</object>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBProjectSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">QuietUnrarAppDelegate.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
			<object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
 | 
					 | 
				
			||||||
				<bool key="EncodedWithXMLCoder">YES</bool>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSActionCell</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSCell</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSApplication</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSResponder</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="727456727">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSApplication</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="260642094">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSApplication</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="58888045">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSApplication</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSApplication</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSApplication</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSCell</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSCell.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSControl</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSView</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="565585571">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSFormatter</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSMenu</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="1072214395">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<reference key="sourceIdentifier" ref="727456727"/>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<reference key="sourceIdentifier" ref="260642094"/>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<reference key="sourceIdentifier" ref="58888045"/>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<reference key="sourceIdentifier" ref="565585571"/>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<reference key="sourceIdentifier" ref="1072214395"/>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSTableView.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="784549063">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSView.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSError.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSResponder</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSResponder</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSObject</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSResponder.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSSecureTextField</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSTextField</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="1036367411">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSSecureTextField.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSSecureTextFieldCell</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSTextFieldCell</string>
 | 
					 | 
				
			||||||
					<reference key="sourceIdentifier" ref="1036367411"/>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSTextField</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSControl</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSTextField.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSTextFieldCell</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSActionCell</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSView</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSClipView.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSView</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSView</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSView</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSResponder</string>
 | 
					 | 
				
			||||||
					<reference key="sourceIdentifier" ref="784549063"/>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSWindow</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSWindow</string>
 | 
					 | 
				
			||||||
					<string key="superclassName">NSResponder</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSWindow.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
				<object class="IBPartialClassDescription">
 | 
					 | 
				
			||||||
					<string key="className">NSWindow</string>
 | 
					 | 
				
			||||||
					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 | 
					 | 
				
			||||||
						<string key="majorKey">IBFrameworkSource</string>
 | 
					 | 
				
			||||||
						<string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string>
 | 
					 | 
				
			||||||
					</object>
 | 
					 | 
				
			||||||
				</object>
 | 
					 | 
				
			||||||
			</object>
 | 
					 | 
				
			||||||
		</object>
 | 
					 | 
				
			||||||
		<int key="IBDocument.localizationMode">0</int>
 | 
					 | 
				
			||||||
		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
 | 
					 | 
				
			||||||
			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
 | 
					 | 
				
			||||||
			<integer value="1060" key="NS.object.0"/>
 | 
					 | 
				
			||||||
		</object>
 | 
					 | 
				
			||||||
		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
 | 
					 | 
				
			||||||
			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
 | 
					 | 
				
			||||||
			<integer value="3000" key="NS.object.0"/>
 | 
					 | 
				
			||||||
		</object>
 | 
					 | 
				
			||||||
		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 | 
					 | 
				
			||||||
		<string key="IBDocument.LastKnownRelativeProjectPath">QuietUnrar.xcodeproj</string>
 | 
					 | 
				
			||||||
		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 | 
					 | 
				
			||||||
	</data>
 | 
					 | 
				
			||||||
</archive>
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,7 +130,7 @@
 | 
				
			||||||
	<key>CFBundleIconFile</key>
 | 
						<key>CFBundleIconFile</key>
 | 
				
			||||||
	<string></string>
 | 
						<string></string>
 | 
				
			||||||
	<key>CFBundleIdentifier</key>
 | 
						<key>CFBundleIdentifier</key>
 | 
				
			||||||
	<string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
 | 
						<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
 | 
				
			||||||
	<key>CFBundleInfoDictionaryVersion</key>
 | 
						<key>CFBundleInfoDictionaryVersion</key>
 | 
				
			||||||
	<string>6.0</string>
 | 
						<string>6.0</string>
 | 
				
			||||||
	<key>CFBundleName</key>
 | 
						<key>CFBundleName</key>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,10 +11,8 @@
 | 
				
			||||||
		8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
 | 
							8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
 | 
				
			||||||
		8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
 | 
							8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
 | 
				
			||||||
		D488BC6810AF437B00B3451C /* libunrar.so in Frameworks */ = {isa = PBXBuildFile; fileRef = D488BC6710AF437B00B3451C /* libunrar.so */; };
 | 
							D488BC6810AF437B00B3451C /* libunrar.so in Frameworks */ = {isa = PBXBuildFile; fileRef = D488BC6710AF437B00B3451C /* libunrar.so */; };
 | 
				
			||||||
		D488BCC110AF49C700B3451C /* libunrar.so in CopyFiles */ = {isa = PBXBuildFile; fileRef = D488BC6710AF437B00B3451C /* libunrar.so */; };
 | 
							D488BCC110AF49C700B3451C /* libunrar.so in CopyFiles */ = {isa = PBXBuildFile; fileRef = D488BC6710AF437B00B3451C /* libunrar.so */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
 | 
				
			||||||
		D488BE5510B05F3800B3451C /* PasswordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D488BE5410B05F3800B3451C /* PasswordView.xib */; };
 | 
							D488BE5510B05F3800B3451C /* PasswordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D488BE5410B05F3800B3451C /* PasswordView.xib */; };
 | 
				
			||||||
		D488BFB010B1F97F00B3451C /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D488BFAF10B1F97F00B3451C /* Growl.framework */; };
 | 
					 | 
				
			||||||
		D488BFBF10B1FBC700B3451C /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D488BFAF10B1F97F00B3451C /* Growl.framework */; };
 | 
					 | 
				
			||||||
		D488BFCC10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */; };
 | 
							D488BFCC10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */; };
 | 
				
			||||||
		D4A49691105435BE00BE38AE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
 | 
							D4A49691105435BE00BE38AE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
 | 
				
			||||||
		D4A49692105435C100BE38AE /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; };
 | 
							D4A49692105435C100BE38AE /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; };
 | 
				
			||||||
| 
						 | 
					@ -38,7 +36,6 @@
 | 
				
			||||||
			dstPath = "";
 | 
								dstPath = "";
 | 
				
			||||||
			dstSubfolderSpec = 10;
 | 
								dstSubfolderSpec = 10;
 | 
				
			||||||
			files = (
 | 
								files = (
 | 
				
			||||||
				D488BFBF10B1FBC700B3451C /* Growl.framework in CopyFiles */,
 | 
					 | 
				
			||||||
				D488BCC110AF49C700B3451C /* libunrar.so in CopyFiles */,
 | 
									D488BCC110AF49C700B3451C /* libunrar.so in CopyFiles */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
								runOnlyForDeploymentPostprocessing = 0;
 | 
				
			||||||
| 
						 | 
					@ -46,10 +43,8 @@
 | 
				
			||||||
/* End PBXCopyFilesBuildPhase section */
 | 
					/* End PBXCopyFilesBuildPhase section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Begin PBXFileReference section */
 | 
					/* Begin PBXFileReference section */
 | 
				
			||||||
		089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
 | 
							1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
 | 
				
			||||||
		13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
 | 
							13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
 | 
				
			||||||
		1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		256AC3D80F4B6AC300CF3369 /* QuietUnrarAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuietUnrarAppDelegate.h; sourceTree = "<group>"; };
 | 
							256AC3D80F4B6AC300CF3369 /* QuietUnrarAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuietUnrarAppDelegate.h; sourceTree = "<group>"; };
 | 
				
			||||||
		256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuietUnrarAppDelegate.m; sourceTree = "<group>"; };
 | 
							256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuietUnrarAppDelegate.m; sourceTree = "<group>"; };
 | 
				
			||||||
		256AC3F00F4B6AF500CF3369 /* QuietUnrar_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuietUnrar_Prefix.pch; sourceTree = "<group>"; };
 | 
							256AC3F00F4B6AF500CF3369 /* QuietUnrar_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuietUnrar_Prefix.pch; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -68,7 +63,6 @@
 | 
				
			||||||
		D4A495761054177300BE38AE /* archive.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = archive.hpp; path = libunrar/archive.hpp; sourceTree = "<group>"; };
 | 
							D4A495761054177300BE38AE /* archive.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = archive.hpp; path = libunrar/archive.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495771054177300BE38AE /* arcread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arcread.cpp; path = libunrar/arcread.cpp; sourceTree = "<group>"; };
 | 
							D4A495771054177300BE38AE /* arcread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arcread.cpp; path = libunrar/arcread.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495781054177300BE38AE /* array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = array.hpp; path = libunrar/array.hpp; sourceTree = "<group>"; };
 | 
							D4A495781054177300BE38AE /* array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = array.hpp; path = libunrar/array.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495791054177300BE38AE /* beosea.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = beosea.cpp; path = libunrar/beosea.cpp; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		D4A4957A1054177300BE38AE /* cmddata.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cmddata.cpp; path = libunrar/cmddata.cpp; sourceTree = "<group>"; };
 | 
							D4A4957A1054177300BE38AE /* cmddata.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cmddata.cpp; path = libunrar/cmddata.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A4957B1054177300BE38AE /* cmddata.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = cmddata.hpp; path = libunrar/cmddata.hpp; sourceTree = "<group>"; };
 | 
							D4A4957B1054177300BE38AE /* cmddata.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = cmddata.hpp; path = libunrar/cmddata.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A4957C1054177300BE38AE /* coder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = coder.cpp; path = libunrar/coder.cpp; sourceTree = "<group>"; };
 | 
							D4A4957C1054177300BE38AE /* coder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = coder.cpp; path = libunrar/coder.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -112,7 +106,6 @@
 | 
				
			||||||
		D4A495A21054177300BE38AE /* loclang.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = loclang.hpp; path = libunrar/loclang.hpp; sourceTree = "<group>"; };
 | 
							D4A495A21054177300BE38AE /* loclang.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = loclang.hpp; path = libunrar/loclang.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495A31054177300BE38AE /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = log.cpp; path = libunrar/log.cpp; sourceTree = "<group>"; };
 | 
							D4A495A31054177300BE38AE /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = log.cpp; path = libunrar/log.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495A41054177300BE38AE /* log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = log.hpp; path = libunrar/log.hpp; sourceTree = "<group>"; };
 | 
							D4A495A41054177300BE38AE /* log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = log.hpp; path = libunrar/log.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495A51054177300BE38AE /* makefile.unix */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = makefile.unix; path = libunrar/makefile.unix; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		D4A495A61054177300BE38AE /* match.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = match.cpp; path = libunrar/match.cpp; sourceTree = "<group>"; };
 | 
							D4A495A61054177300BE38AE /* match.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = match.cpp; path = libunrar/match.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495A71054177300BE38AE /* match.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = match.hpp; path = libunrar/match.hpp; sourceTree = "<group>"; };
 | 
							D4A495A71054177300BE38AE /* match.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = match.hpp; path = libunrar/match.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495A81054177300BE38AE /* model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = model.cpp; path = libunrar/model.cpp; sourceTree = "<group>"; };
 | 
							D4A495A81054177300BE38AE /* model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = model.cpp; path = libunrar/model.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -120,7 +113,6 @@
 | 
				
			||||||
		D4A495AA1054177300BE38AE /* options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = options.cpp; path = libunrar/options.cpp; sourceTree = "<group>"; };
 | 
							D4A495AA1054177300BE38AE /* options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = options.cpp; path = libunrar/options.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495AB1054177300BE38AE /* options.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = options.hpp; path = libunrar/options.hpp; sourceTree = "<group>"; };
 | 
							D4A495AB1054177300BE38AE /* options.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = options.hpp; path = libunrar/options.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495AC1054177300BE38AE /* os.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = os.hpp; path = libunrar/os.hpp; sourceTree = "<group>"; };
 | 
							D4A495AC1054177300BE38AE /* os.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = os.hpp; path = libunrar/os.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495AD1054177300BE38AE /* os2ea.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = os2ea.cpp; path = libunrar/os2ea.cpp; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		D4A495AE1054177300BE38AE /* pathfn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pathfn.cpp; path = libunrar/pathfn.cpp; sourceTree = "<group>"; };
 | 
							D4A495AE1054177300BE38AE /* pathfn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pathfn.cpp; path = libunrar/pathfn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495AF1054177300BE38AE /* pathfn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = pathfn.hpp; path = libunrar/pathfn.hpp; sourceTree = "<group>"; };
 | 
							D4A495AF1054177300BE38AE /* pathfn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = pathfn.hpp; path = libunrar/pathfn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495B01054177300BE38AE /* rar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rar.cpp; path = libunrar/rar.cpp; sourceTree = "<group>"; };
 | 
							D4A495B01054177300BE38AE /* rar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rar.cpp; path = libunrar/rar.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -131,7 +123,6 @@
 | 
				
			||||||
		D4A495B51054177300BE38AE /* rartypes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rartypes.hpp; path = libunrar/rartypes.hpp; sourceTree = "<group>"; };
 | 
							D4A495B51054177300BE38AE /* rartypes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rartypes.hpp; path = libunrar/rartypes.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495B61054177300BE38AE /* rarvm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rarvm.cpp; path = libunrar/rarvm.cpp; sourceTree = "<group>"; };
 | 
							D4A495B61054177300BE38AE /* rarvm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rarvm.cpp; path = libunrar/rarvm.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495B71054177300BE38AE /* rarvm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rarvm.hpp; path = libunrar/rarvm.hpp; sourceTree = "<group>"; };
 | 
							D4A495B71054177300BE38AE /* rarvm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rarvm.hpp; path = libunrar/rarvm.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495B81054177300BE38AE /* rarvmtbl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rarvmtbl.cpp; path = libunrar/rarvmtbl.cpp; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		D4A495B91054177300BE38AE /* rawread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rawread.cpp; path = libunrar/rawread.cpp; sourceTree = "<group>"; };
 | 
							D4A495B91054177300BE38AE /* rawread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rawread.cpp; path = libunrar/rawread.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495BA1054177300BE38AE /* rawread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rawread.hpp; path = libunrar/rawread.hpp; sourceTree = "<group>"; };
 | 
							D4A495BA1054177300BE38AE /* rawread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rawread.hpp; path = libunrar/rawread.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495BB1054177300BE38AE /* rdwrfn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rdwrfn.cpp; path = libunrar/rdwrfn.cpp; sourceTree = "<group>"; };
 | 
							D4A495BB1054177300BE38AE /* rdwrfn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rdwrfn.cpp; path = libunrar/rdwrfn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -144,7 +135,6 @@
 | 
				
			||||||
		D4A495C21054177300BE38AE /* rijndael.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rijndael.hpp; path = libunrar/rijndael.hpp; sourceTree = "<group>"; };
 | 
							D4A495C21054177300BE38AE /* rijndael.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rijndael.hpp; path = libunrar/rijndael.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495C31054177300BE38AE /* rs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rs.cpp; path = libunrar/rs.cpp; sourceTree = "<group>"; };
 | 
							D4A495C31054177300BE38AE /* rs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rs.cpp; path = libunrar/rs.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495C41054177300BE38AE /* rs.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rs.hpp; path = libunrar/rs.hpp; sourceTree = "<group>"; };
 | 
							D4A495C41054177300BE38AE /* rs.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = rs.hpp; path = libunrar/rs.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495C51054177300BE38AE /* savepos.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = savepos.cpp; path = libunrar/savepos.cpp; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		D4A495C61054177300BE38AE /* savepos.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = savepos.hpp; path = libunrar/savepos.hpp; sourceTree = "<group>"; };
 | 
							D4A495C61054177300BE38AE /* savepos.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = savepos.hpp; path = libunrar/savepos.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495C71054177300BE38AE /* scantree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = scantree.cpp; path = libunrar/scantree.cpp; sourceTree = "<group>"; };
 | 
							D4A495C71054177300BE38AE /* scantree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = scantree.cpp; path = libunrar/scantree.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495C81054177300BE38AE /* scantree.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = scantree.hpp; path = libunrar/scantree.hpp; sourceTree = "<group>"; };
 | 
							D4A495C81054177300BE38AE /* scantree.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = scantree.hpp; path = libunrar/scantree.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -163,10 +153,8 @@
 | 
				
			||||||
		D4A495D51054177300BE38AE /* timefn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = timefn.cpp; path = libunrar/timefn.cpp; sourceTree = "<group>"; };
 | 
							D4A495D51054177300BE38AE /* timefn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = timefn.cpp; path = libunrar/timefn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495D61054177300BE38AE /* timefn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = timefn.hpp; path = libunrar/timefn.hpp; sourceTree = "<group>"; };
 | 
							D4A495D61054177300BE38AE /* timefn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = timefn.hpp; path = libunrar/timefn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495D71054177300BE38AE /* ulinks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ulinks.cpp; path = libunrar/ulinks.cpp; sourceTree = "<group>"; };
 | 
							D4A495D71054177300BE38AE /* ulinks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ulinks.cpp; path = libunrar/ulinks.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495D81054177300BE38AE /* ulinks.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ulinks.hpp; path = libunrar/ulinks.hpp; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		D4A495D91054177300BE38AE /* unicode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unicode.cpp; path = libunrar/unicode.cpp; sourceTree = "<group>"; };
 | 
							D4A495D91054177300BE38AE /* unicode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unicode.cpp; path = libunrar/unicode.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495DA1054177300BE38AE /* unicode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = unicode.hpp; path = libunrar/unicode.hpp; sourceTree = "<group>"; };
 | 
							D4A495DA1054177300BE38AE /* unicode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = unicode.hpp; path = libunrar/unicode.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495DB1054177300BE38AE /* unios2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unios2.cpp; path = libunrar/unios2.cpp; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		D4A495DC1054177300BE38AE /* unpack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unpack.cpp; path = libunrar/unpack.cpp; sourceTree = "<group>"; };
 | 
							D4A495DC1054177300BE38AE /* unpack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unpack.cpp; path = libunrar/unpack.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495DD1054177300BE38AE /* unpack.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = unpack.hpp; path = libunrar/unpack.hpp; sourceTree = "<group>"; };
 | 
							D4A495DD1054177300BE38AE /* unpack.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = unpack.hpp; path = libunrar/unpack.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495DE1054177300BE38AE /* unpack15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unpack15.cpp; path = libunrar/unpack15.cpp; sourceTree = "<group>"; };
 | 
							D4A495DE1054177300BE38AE /* unpack15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unpack15.cpp; path = libunrar/unpack15.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -178,6 +166,8 @@
 | 
				
			||||||
		D4A495E41054177300BE38AE /* win32acl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = win32acl.cpp; path = libunrar/win32acl.cpp; sourceTree = "<group>"; };
 | 
							D4A495E41054177300BE38AE /* win32acl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = win32acl.cpp; path = libunrar/win32acl.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A495E51054177300BE38AE /* win32stm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = win32stm.cpp; path = libunrar/win32stm.cpp; sourceTree = "<group>"; };
 | 
							D4A495E51054177300BE38AE /* win32stm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = win32stm.cpp; path = libunrar/win32stm.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
		D4A96E2010545E9A0091ECB4 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
 | 
							D4A96E2010545E9A0091ECB4 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
 | 
				
			||||||
 | 
							E296811D24BE4BCD00974229 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296811E24BE4BCD00974229 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
 | 
				
			||||||
/* End PBXFileReference section */
 | 
					/* End PBXFileReference section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Begin PBXFrameworksBuildPhase section */
 | 
					/* Begin PBXFrameworksBuildPhase section */
 | 
				
			||||||
| 
						 | 
					@ -188,7 +178,6 @@
 | 
				
			||||||
				D488BC6810AF437B00B3451C /* libunrar.so in Frameworks */,
 | 
									D488BC6810AF437B00B3451C /* libunrar.so in Frameworks */,
 | 
				
			||||||
				8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
 | 
									8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
 | 
				
			||||||
				D4A96E2110545E9A0091ECB4 /* Carbon.framework in Frameworks */,
 | 
									D4A96E2110545E9A0091ECB4 /* Carbon.framework in Frameworks */,
 | 
				
			||||||
				D488BFB010B1F97F00B3451C /* Growl.framework in Frameworks */,
 | 
					 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
								runOnlyForDeploymentPostprocessing = 0;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
| 
						 | 
					@ -285,7 +274,6 @@
 | 
				
			||||||
				D4A495761054177300BE38AE /* archive.hpp */,
 | 
									D4A495761054177300BE38AE /* archive.hpp */,
 | 
				
			||||||
				D4A495771054177300BE38AE /* arcread.cpp */,
 | 
									D4A495771054177300BE38AE /* arcread.cpp */,
 | 
				
			||||||
				D4A495781054177300BE38AE /* array.hpp */,
 | 
									D4A495781054177300BE38AE /* array.hpp */,
 | 
				
			||||||
				D4A495791054177300BE38AE /* beosea.cpp */,
 | 
					 | 
				
			||||||
				D4A4957A1054177300BE38AE /* cmddata.cpp */,
 | 
									D4A4957A1054177300BE38AE /* cmddata.cpp */,
 | 
				
			||||||
				D4A4957B1054177300BE38AE /* cmddata.hpp */,
 | 
									D4A4957B1054177300BE38AE /* cmddata.hpp */,
 | 
				
			||||||
				D4A4957C1054177300BE38AE /* coder.cpp */,
 | 
									D4A4957C1054177300BE38AE /* coder.cpp */,
 | 
				
			||||||
| 
						 | 
					@ -329,7 +317,6 @@
 | 
				
			||||||
				D4A495A21054177300BE38AE /* loclang.hpp */,
 | 
									D4A495A21054177300BE38AE /* loclang.hpp */,
 | 
				
			||||||
				D4A495A31054177300BE38AE /* log.cpp */,
 | 
									D4A495A31054177300BE38AE /* log.cpp */,
 | 
				
			||||||
				D4A495A41054177300BE38AE /* log.hpp */,
 | 
									D4A495A41054177300BE38AE /* log.hpp */,
 | 
				
			||||||
				D4A495A51054177300BE38AE /* makefile.unix */,
 | 
					 | 
				
			||||||
				D4A495A61054177300BE38AE /* match.cpp */,
 | 
									D4A495A61054177300BE38AE /* match.cpp */,
 | 
				
			||||||
				D4A495A71054177300BE38AE /* match.hpp */,
 | 
									D4A495A71054177300BE38AE /* match.hpp */,
 | 
				
			||||||
				D4A495A81054177300BE38AE /* model.cpp */,
 | 
									D4A495A81054177300BE38AE /* model.cpp */,
 | 
				
			||||||
| 
						 | 
					@ -337,7 +324,6 @@
 | 
				
			||||||
				D4A495AA1054177300BE38AE /* options.cpp */,
 | 
									D4A495AA1054177300BE38AE /* options.cpp */,
 | 
				
			||||||
				D4A495AB1054177300BE38AE /* options.hpp */,
 | 
									D4A495AB1054177300BE38AE /* options.hpp */,
 | 
				
			||||||
				D4A495AC1054177300BE38AE /* os.hpp */,
 | 
									D4A495AC1054177300BE38AE /* os.hpp */,
 | 
				
			||||||
				D4A495AD1054177300BE38AE /* os2ea.cpp */,
 | 
					 | 
				
			||||||
				D4A495AE1054177300BE38AE /* pathfn.cpp */,
 | 
									D4A495AE1054177300BE38AE /* pathfn.cpp */,
 | 
				
			||||||
				D4A495AF1054177300BE38AE /* pathfn.hpp */,
 | 
									D4A495AF1054177300BE38AE /* pathfn.hpp */,
 | 
				
			||||||
				D4A495B01054177300BE38AE /* rar.cpp */,
 | 
									D4A495B01054177300BE38AE /* rar.cpp */,
 | 
				
			||||||
| 
						 | 
					@ -348,7 +334,6 @@
 | 
				
			||||||
				D4A495B51054177300BE38AE /* rartypes.hpp */,
 | 
									D4A495B51054177300BE38AE /* rartypes.hpp */,
 | 
				
			||||||
				D4A495B61054177300BE38AE /* rarvm.cpp */,
 | 
									D4A495B61054177300BE38AE /* rarvm.cpp */,
 | 
				
			||||||
				D4A495B71054177300BE38AE /* rarvm.hpp */,
 | 
									D4A495B71054177300BE38AE /* rarvm.hpp */,
 | 
				
			||||||
				D4A495B81054177300BE38AE /* rarvmtbl.cpp */,
 | 
					 | 
				
			||||||
				D4A495B91054177300BE38AE /* rawread.cpp */,
 | 
									D4A495B91054177300BE38AE /* rawread.cpp */,
 | 
				
			||||||
				D4A495BA1054177300BE38AE /* rawread.hpp */,
 | 
									D4A495BA1054177300BE38AE /* rawread.hpp */,
 | 
				
			||||||
				D4A495BB1054177300BE38AE /* rdwrfn.cpp */,
 | 
									D4A495BB1054177300BE38AE /* rdwrfn.cpp */,
 | 
				
			||||||
| 
						 | 
					@ -361,7 +346,6 @@
 | 
				
			||||||
				D4A495C21054177300BE38AE /* rijndael.hpp */,
 | 
									D4A495C21054177300BE38AE /* rijndael.hpp */,
 | 
				
			||||||
				D4A495C31054177300BE38AE /* rs.cpp */,
 | 
									D4A495C31054177300BE38AE /* rs.cpp */,
 | 
				
			||||||
				D4A495C41054177300BE38AE /* rs.hpp */,
 | 
									D4A495C41054177300BE38AE /* rs.hpp */,
 | 
				
			||||||
				D4A495C51054177300BE38AE /* savepos.cpp */,
 | 
					 | 
				
			||||||
				D4A495C61054177300BE38AE /* savepos.hpp */,
 | 
									D4A495C61054177300BE38AE /* savepos.hpp */,
 | 
				
			||||||
				D4A495C71054177300BE38AE /* scantree.cpp */,
 | 
									D4A495C71054177300BE38AE /* scantree.cpp */,
 | 
				
			||||||
				D4A495C81054177300BE38AE /* scantree.hpp */,
 | 
									D4A495C81054177300BE38AE /* scantree.hpp */,
 | 
				
			||||||
| 
						 | 
					@ -380,10 +364,8 @@
 | 
				
			||||||
				D4A495D51054177300BE38AE /* timefn.cpp */,
 | 
									D4A495D51054177300BE38AE /* timefn.cpp */,
 | 
				
			||||||
				D4A495D61054177300BE38AE /* timefn.hpp */,
 | 
									D4A495D61054177300BE38AE /* timefn.hpp */,
 | 
				
			||||||
				D4A495D71054177300BE38AE /* ulinks.cpp */,
 | 
									D4A495D71054177300BE38AE /* ulinks.cpp */,
 | 
				
			||||||
				D4A495D81054177300BE38AE /* ulinks.hpp */,
 | 
					 | 
				
			||||||
				D4A495D91054177300BE38AE /* unicode.cpp */,
 | 
									D4A495D91054177300BE38AE /* unicode.cpp */,
 | 
				
			||||||
				D4A495DA1054177300BE38AE /* unicode.hpp */,
 | 
									D4A495DA1054177300BE38AE /* unicode.hpp */,
 | 
				
			||||||
				D4A495DB1054177300BE38AE /* unios2.cpp */,
 | 
					 | 
				
			||||||
				D4A495DC1054177300BE38AE /* unpack.cpp */,
 | 
									D4A495DC1054177300BE38AE /* unpack.cpp */,
 | 
				
			||||||
				D4A495DD1054177300BE38AE /* unpack.hpp */,
 | 
									D4A495DD1054177300BE38AE /* unpack.hpp */,
 | 
				
			||||||
				D4A495DE1054177300BE38AE /* unpack15.cpp */,
 | 
									D4A495DE1054177300BE38AE /* unpack15.cpp */,
 | 
				
			||||||
| 
						 | 
					@ -403,7 +385,7 @@
 | 
				
			||||||
/* Begin PBXLegacyTarget section */
 | 
					/* Begin PBXLegacyTarget section */
 | 
				
			||||||
		D4A4962A105419AA00BE38AE /* libunrar */ = {
 | 
							D4A4962A105419AA00BE38AE /* libunrar */ = {
 | 
				
			||||||
			isa = PBXLegacyTarget;
 | 
								isa = PBXLegacyTarget;
 | 
				
			||||||
			buildArgumentsString = "-f makefile.unix lib $(ACTION)";
 | 
								buildArgumentsString = "-f makefile lib";
 | 
				
			||||||
			buildConfigurationList = D4A4962D105419C800BE38AE /* Build configuration list for PBXLegacyTarget "libunrar" */;
 | 
								buildConfigurationList = D4A4962D105419C800BE38AE /* Build configuration list for PBXLegacyTarget "libunrar" */;
 | 
				
			||||||
			buildPhases = (
 | 
								buildPhases = (
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
| 
						 | 
					@ -444,9 +426,17 @@
 | 
				
			||||||
/* Begin PBXProject section */
 | 
					/* Begin PBXProject section */
 | 
				
			||||||
		29B97313FDCFA39411CA2CEA /* Project object */ = {
 | 
							29B97313FDCFA39411CA2CEA /* Project object */ = {
 | 
				
			||||||
			isa = PBXProject;
 | 
								isa = PBXProject;
 | 
				
			||||||
 | 
								attributes = {
 | 
				
			||||||
 | 
									LastUpgradeCheck = 1200;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
			buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "QuietUnrar" */;
 | 
								buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "QuietUnrar" */;
 | 
				
			||||||
			compatibilityVersion = "Xcode 3.2";
 | 
								compatibilityVersion = "Xcode 3.2";
 | 
				
			||||||
 | 
								developmentRegion = en;
 | 
				
			||||||
			hasScannedForEncodings = 1;
 | 
								hasScannedForEncodings = 1;
 | 
				
			||||||
 | 
								knownRegions = (
 | 
				
			||||||
 | 
									en,
 | 
				
			||||||
 | 
									Base,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
			mainGroup = 29B97314FDCFA39411CA2CEA /* QuietUnrar */;
 | 
								mainGroup = 29B97314FDCFA39411CA2CEA /* QuietUnrar */;
 | 
				
			||||||
			projectDirPath = "";
 | 
								projectDirPath = "";
 | 
				
			||||||
			projectRoot = "";
 | 
								projectRoot = "";
 | 
				
			||||||
| 
						 | 
					@ -511,7 +501,7 @@
 | 
				
			||||||
		089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
 | 
							089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
 | 
				
			||||||
			isa = PBXVariantGroup;
 | 
								isa = PBXVariantGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
				089C165DFE840E0CC02AAC07 /* English */,
 | 
									E296811D24BE4BCD00974229 /* en */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			name = InfoPlist.strings;
 | 
								name = InfoPlist.strings;
 | 
				
			||||||
			sourceTree = "<group>";
 | 
								sourceTree = "<group>";
 | 
				
			||||||
| 
						 | 
					@ -519,7 +509,7 @@
 | 
				
			||||||
		1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = {
 | 
							1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = {
 | 
				
			||||||
			isa = PBXVariantGroup;
 | 
								isa = PBXVariantGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
				1DDD58150DA1D0A300B32029 /* English */,
 | 
									E296811E24BE4BCD00974229 /* en */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			name = MainMenu.xib;
 | 
								name = MainMenu.xib;
 | 
				
			||||||
			sourceTree = "<group>";
 | 
								sourceTree = "<group>";
 | 
				
			||||||
| 
						 | 
					@ -531,13 +521,14 @@
 | 
				
			||||||
			isa = XCBuildConfiguration;
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
			buildSettings = {
 | 
								buildSettings = {
 | 
				
			||||||
				ALWAYS_SEARCH_USER_PATHS = NO;
 | 
									ALWAYS_SEARCH_USER_PATHS = NO;
 | 
				
			||||||
 | 
									CLANG_ENABLE_OBJC_WEAK = YES;
 | 
				
			||||||
 | 
									CODE_SIGN_IDENTITY = "-";
 | 
				
			||||||
				COPY_PHASE_STRIP = NO;
 | 
									COPY_PHASE_STRIP = NO;
 | 
				
			||||||
				FRAMEWORK_SEARCH_PATHS = (
 | 
									FRAMEWORK_SEARCH_PATHS = (
 | 
				
			||||||
					"$(inherited)",
 | 
										"$(inherited)",
 | 
				
			||||||
					"\"$(SRCROOT)/Frameworks\"",
 | 
										"\"$(SRCROOT)/Frameworks\"",
 | 
				
			||||||
				);
 | 
									);
 | 
				
			||||||
				GCC_DYNAMIC_NO_PIC = NO;
 | 
									GCC_DYNAMIC_NO_PIC = NO;
 | 
				
			||||||
				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 | 
					 | 
				
			||||||
				GCC_MODEL_TUNING = G5;
 | 
									GCC_MODEL_TUNING = G5;
 | 
				
			||||||
				GCC_OPTIMIZATION_LEVEL = 0;
 | 
									GCC_OPTIMIZATION_LEVEL = 0;
 | 
				
			||||||
				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 | 
									GCC_PRECOMPILE_PREFIX_HEADER = YES;
 | 
				
			||||||
| 
						 | 
					@ -551,6 +542,7 @@
 | 
				
			||||||
					"$(inherited)",
 | 
										"$(inherited)",
 | 
				
			||||||
					"\"$(SRCROOT)/libunrar\"",
 | 
										"\"$(SRCROOT)/libunrar\"",
 | 
				
			||||||
				);
 | 
									);
 | 
				
			||||||
 | 
									PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.${PRODUCT_NAME:rfc1034identifier}";
 | 
				
			||||||
				PRODUCT_NAME = QuietUnrar;
 | 
									PRODUCT_NAME = QuietUnrar;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
			name = Debug;
 | 
								name = Debug;
 | 
				
			||||||
| 
						 | 
					@ -559,6 +551,8 @@
 | 
				
			||||||
			isa = XCBuildConfiguration;
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
			buildSettings = {
 | 
								buildSettings = {
 | 
				
			||||||
				ALWAYS_SEARCH_USER_PATHS = NO;
 | 
									ALWAYS_SEARCH_USER_PATHS = NO;
 | 
				
			||||||
 | 
									CLANG_ENABLE_OBJC_WEAK = YES;
 | 
				
			||||||
 | 
									CODE_SIGN_IDENTITY = "-";
 | 
				
			||||||
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 | 
									DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 | 
				
			||||||
				FRAMEWORK_SEARCH_PATHS = (
 | 
									FRAMEWORK_SEARCH_PATHS = (
 | 
				
			||||||
					"$(inherited)",
 | 
										"$(inherited)",
 | 
				
			||||||
| 
						 | 
					@ -576,6 +570,7 @@
 | 
				
			||||||
					"$(inherited)",
 | 
										"$(inherited)",
 | 
				
			||||||
					"\"$(SRCROOT)/libunrar\"",
 | 
										"\"$(SRCROOT)/libunrar\"",
 | 
				
			||||||
				);
 | 
									);
 | 
				
			||||||
 | 
									PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.${PRODUCT_NAME:rfc1034identifier}";
 | 
				
			||||||
				PRODUCT_NAME = QuietUnrar;
 | 
									PRODUCT_NAME = QuietUnrar;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
			name = Release;
 | 
								name = Release;
 | 
				
			||||||
| 
						 | 
					@ -583,52 +578,102 @@
 | 
				
			||||||
		C01FCF4F08A954540054247B /* Debug */ = {
 | 
							C01FCF4F08A954540054247B /* Debug */ = {
 | 
				
			||||||
			isa = XCBuildConfiguration;
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
			buildSettings = {
 | 
								buildSettings = {
 | 
				
			||||||
				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 | 
									CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_BOOL_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_COMMA = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_CONSTANT_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_EMPTY_BODY = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_ENUM_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_INFINITE_RECURSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_INT_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_STRICT_PROTOTYPES = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_SUSPICIOUS_MOVE = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_UNREACHABLE_CODE = YES;
 | 
				
			||||||
 | 
									CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 | 
				
			||||||
 | 
									ENABLE_STRICT_OBJC_MSGSEND = YES;
 | 
				
			||||||
 | 
									ENABLE_TESTABILITY = YES;
 | 
				
			||||||
				GCC_C_LANGUAGE_STANDARD = gnu99;
 | 
									GCC_C_LANGUAGE_STANDARD = gnu99;
 | 
				
			||||||
				GCC_ENABLE_OBJC_GC = required;
 | 
									GCC_NO_COMMON_BLOCKS = YES;
 | 
				
			||||||
				GCC_OPTIMIZATION_LEVEL = 0;
 | 
									GCC_OPTIMIZATION_LEVEL = 0;
 | 
				
			||||||
				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 | 
									GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 | 
				
			||||||
 | 
									GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 | 
				
			||||||
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
									GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNDECLARED_SELECTOR = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNINITIALIZED_AUTOS = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNUSED_FUNCTION = YES;
 | 
				
			||||||
				GCC_WARN_UNUSED_VARIABLE = YES;
 | 
									GCC_WARN_UNUSED_VARIABLE = YES;
 | 
				
			||||||
 | 
									MACOSX_DEPLOYMENT_TARGET = 10.15;
 | 
				
			||||||
				ONLY_ACTIVE_ARCH = YES;
 | 
									ONLY_ACTIVE_ARCH = YES;
 | 
				
			||||||
				PREBINDING = NO;
 | 
									SDKROOT = macosx;
 | 
				
			||||||
				SDKROOT = macosx10.6;
 | 
									VALID_ARCHS = "arm64 arm64e i386 x86_64";
 | 
				
			||||||
				VALID_ARCHS = "i386 x86_64";
 | 
					 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
			name = Debug;
 | 
								name = Debug;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		C01FCF5008A954540054247B /* Release */ = {
 | 
							C01FCF5008A954540054247B /* Release */ = {
 | 
				
			||||||
			isa = XCBuildConfiguration;
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
			buildSettings = {
 | 
								buildSettings = {
 | 
				
			||||||
				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 | 
									CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_BOOL_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_COMMA = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_CONSTANT_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_EMPTY_BODY = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_ENUM_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_INFINITE_RECURSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_INT_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_STRICT_PROTOTYPES = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_SUSPICIOUS_MOVE = YES;
 | 
				
			||||||
 | 
									CLANG_WARN_UNREACHABLE_CODE = YES;
 | 
				
			||||||
 | 
									CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 | 
				
			||||||
 | 
									ENABLE_STRICT_OBJC_MSGSEND = YES;
 | 
				
			||||||
				GCC_C_LANGUAGE_STANDARD = gnu99;
 | 
									GCC_C_LANGUAGE_STANDARD = gnu99;
 | 
				
			||||||
				GCC_ENABLE_OBJC_GC = required;
 | 
									GCC_NO_COMMON_BLOCKS = YES;
 | 
				
			||||||
				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 | 
									GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 | 
				
			||||||
 | 
									GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 | 
				
			||||||
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
									GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNDECLARED_SELECTOR = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNINITIALIZED_AUTOS = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNUSED_FUNCTION = YES;
 | 
				
			||||||
				GCC_WARN_UNUSED_VARIABLE = YES;
 | 
									GCC_WARN_UNUSED_VARIABLE = YES;
 | 
				
			||||||
				PREBINDING = NO;
 | 
									MACOSX_DEPLOYMENT_TARGET = 10.15;
 | 
				
			||||||
				SDKROOT = macosx10.6;
 | 
									SDKROOT = macosx;
 | 
				
			||||||
				VALID_ARCHS = "i386 x86_64";
 | 
									VALID_ARCHS = "arm64 arm64e i386 x86_64";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
			name = Release;
 | 
								name = Release;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		D4A4962B105419AA00BE38AE /* Debug */ = {
 | 
							D4A4962B105419AA00BE38AE /* Debug */ = {
 | 
				
			||||||
			isa = XCBuildConfiguration;
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
			buildSettings = {
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									CLANG_ENABLE_OBJC_WEAK = YES;
 | 
				
			||||||
				COPY_PHASE_STRIP = NO;
 | 
									COPY_PHASE_STRIP = NO;
 | 
				
			||||||
				GCC_DYNAMIC_NO_PIC = NO;
 | 
									GCC_DYNAMIC_NO_PIC = NO;
 | 
				
			||||||
				GCC_OPTIMIZATION_LEVEL = 0;
 | 
									GCC_OPTIMIZATION_LEVEL = 0;
 | 
				
			||||||
				PRODUCT_NAME = libunrar;
 | 
									PRODUCT_NAME = libunrar;
 | 
				
			||||||
 | 
									SDKROOT = macosx;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
			name = Debug;
 | 
								name = Debug;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		D4A4962C105419AA00BE38AE /* Release */ = {
 | 
							D4A4962C105419AA00BE38AE /* Release */ = {
 | 
				
			||||||
			isa = XCBuildConfiguration;
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
			buildSettings = {
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									CLANG_ENABLE_OBJC_WEAK = YES;
 | 
				
			||||||
				COPY_PHASE_STRIP = YES;
 | 
									COPY_PHASE_STRIP = YES;
 | 
				
			||||||
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 | 
									DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 | 
				
			||||||
				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 | 
					 | 
				
			||||||
				PRODUCT_NAME = libunrar;
 | 
									PRODUCT_NAME = libunrar;
 | 
				
			||||||
 | 
									SDKROOT = macosx;
 | 
				
			||||||
				ZERO_LINK = NO;
 | 
									ZERO_LINK = NO;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
			name = Release;
 | 
								name = Release;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#import <Carbon/Carbon.h>
 | 
					#import <Carbon/Carbon.h>
 | 
				
			||||||
#import <Growl/Growl.h>
 | 
					//#import <Growl/Growl.h>
 | 
				
			||||||
#import "QuietUnrarAppDelegate.h"
 | 
					#import "QuietUnrarAppDelegate.h"
 | 
				
			||||||
#import "libunrar/dll.hpp"
 | 
					#import "libunrar/dll.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,16 +91,16 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
 | 
				
			||||||
	for (NSString * filename in arrayOfFilenames) {
 | 
						for (NSString * filename in arrayOfFilenames) {
 | 
				
			||||||
		BOOL extracted = [self extractRarWith:filename];
 | 
							BOOL extracted = [self extractRarWith:filename];
 | 
				
			||||||
		if (extracted) {
 | 
							if (extracted) {
 | 
				
			||||||
			[GrowlApplicationBridge setGrowlDelegate:@""];
 | 
								//[GrowlApplicationBridge setGrowlDelegate:@""];
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			[GrowlApplicationBridge
 | 
					//			[GrowlApplicationBridge
 | 
				
			||||||
			 notifyWithTitle:@"QuietUnrar: Extraction Complete"
 | 
					//			 notifyWithTitle:@"QuietUnrar: Extraction Complete"
 | 
				
			||||||
			 description:[NSString stringWithFormat:@"The archive %@ was successfully extracted", filename]
 | 
					//			 description:[NSString stringWithFormat:@"The archive %@ was successfully extracted", filename]
 | 
				
			||||||
			 notificationName:@"QuietUnrarExtractionComplete"
 | 
					//			 notificationName:@"QuietUnrarExtractionComplete"
 | 
				
			||||||
			 iconData:nil
 | 
					//			 iconData:nil
 | 
				
			||||||
			 priority:0
 | 
					//			 priority:0
 | 
				
			||||||
			 isSticky:NO
 | 
					//			 isSticky:NO
 | 
				
			||||||
			 clickContext:nil];
 | 
					//			 clickContext:nil];
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,669 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17132.0.2" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
 | 
				
			||||||
 | 
					    <dependencies>
 | 
				
			||||||
 | 
					        <deployment identifier="macosx"/>
 | 
				
			||||||
 | 
					        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17132.0.2"/>
 | 
				
			||||||
 | 
					        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
 | 
				
			||||||
 | 
					    </dependencies>
 | 
				
			||||||
 | 
					    <objects>
 | 
				
			||||||
 | 
					        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
 | 
				
			||||||
 | 
					            <connections>
 | 
				
			||||||
 | 
					                <outlet property="delegate" destination="494" id="495"/>
 | 
				
			||||||
 | 
					            </connections>
 | 
				
			||||||
 | 
					        </customObject>
 | 
				
			||||||
 | 
					        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
 | 
				
			||||||
 | 
					        <customObject id="-3" userLabel="Application"/>
 | 
				
			||||||
 | 
					        <menu title="AMainMenu" systemMenu="main" id="29">
 | 
				
			||||||
 | 
					            <items>
 | 
				
			||||||
 | 
					                <menuItem title="QuietUnrar" id="56">
 | 
				
			||||||
 | 
					                    <menu key="submenu" title="QuietUnrar" systemMenu="apple" id="57">
 | 
				
			||||||
 | 
					                        <items>
 | 
				
			||||||
 | 
					                            <menuItem title="About QuietUnrar" id="58">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="236">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Preferences…" keyEquivalent="," id="129"/>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="143">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Services" id="131">
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Services" systemMenu="services" id="130"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="144">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Hide QuietUnrar" keyEquivalent="h" id="134">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="hide:" target="-1" id="367"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Hide Others" keyEquivalent="h" id="145">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="hideOtherApplications:" target="-1" id="368"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Show All" id="150">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="unhideAllApplications:" target="-1" id="370"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="149">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Quit QuietUnrar" keyEquivalent="q" id="136">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="terminate:" target="-3" id="449"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                        </items>
 | 
				
			||||||
 | 
					                    </menu>
 | 
				
			||||||
 | 
					                </menuItem>
 | 
				
			||||||
 | 
					                <menuItem title="File" id="83">
 | 
				
			||||||
 | 
					                    <menu key="submenu" title="File" id="81">
 | 
				
			||||||
 | 
					                        <items>
 | 
				
			||||||
 | 
					                            <menuItem title="New" keyEquivalent="n" id="82">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="newDocument:" target="-1" id="373"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Open…" keyEquivalent="o" id="72">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="openDocument:" target="-1" id="374"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Open Recent" id="124">
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Clear Menu" id="126">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="clearRecentDocuments:" target="-1" id="127"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="79">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Close" keyEquivalent="w" id="73">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="performClose:" target="-1" id="193"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Save" keyEquivalent="s" id="75">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="saveDocument:" target="-1" id="362"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Save As…" keyEquivalent="S" id="80">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="saveDocumentAs:" target="-1" id="363"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Revert to Saved" id="112">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="revertDocumentToSaved:" target="-1" id="364"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="74">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Page Setup..." keyEquivalent="P" id="77">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="runPageLayout:" target="-1" id="87"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Print…" keyEquivalent="p" id="78">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="print:" target="-1" id="86"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                        </items>
 | 
				
			||||||
 | 
					                    </menu>
 | 
				
			||||||
 | 
					                </menuItem>
 | 
				
			||||||
 | 
					                <menuItem title="Edit" id="217">
 | 
				
			||||||
 | 
					                    <menu key="submenu" title="Edit" id="205">
 | 
				
			||||||
 | 
					                        <items>
 | 
				
			||||||
 | 
					                            <menuItem title="Undo" keyEquivalent="z" id="207">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="undo:" target="-1" id="223"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Redo" keyEquivalent="Z" id="215">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="redo:" target="-1" id="231"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="206">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Cut" keyEquivalent="x" id="199">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="cut:" target="-1" id="228"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Copy" keyEquivalent="c" id="197">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="copy:" target="-1" id="224"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Paste" keyEquivalent="v" id="203">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="paste:" target="-1" id="226"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="pasteAsPlainText:" target="-1" id="486"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Delete" id="202">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="delete:" target="-1" id="235"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Select All" keyEquivalent="a" id="198">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="selectAll:" target="-1" id="232"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="214">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Find" id="218">
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Find" id="220">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Find…" tag="1" keyEquivalent="f" id="209">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="performFindPanelAction:" target="-1" id="241"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Find Next" tag="2" keyEquivalent="g" id="208">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="performFindPanelAction:" target="-1" id="487"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="performFindPanelAction:" target="-1" id="488"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="performFindPanelAction:" target="-1" id="489"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Jump to Selection" keyEquivalent="j" id="210">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="centerSelectionInVisibleArea:" target="-1" id="245"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Spelling and Grammar" id="216">
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Spelling and Grammar" id="200">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="showGuessPanel:" target="-1" id="230"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Check Document Now" keyEquivalent=";" id="201">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="checkSpelling:" target="-1" id="225"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="453"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Check Spelling While Typing" id="219">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleContinuousSpellChecking:" target="-1" id="222"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Check Grammar With Spelling" id="346">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleGrammarChecking:" target="-1" id="347"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Correct Spelling Automatically" id="454">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Substitutions" id="348">
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Substitutions" id="349">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Show Substitutions" id="457">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="459"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleSmartInsertDelete:" target="-1" id="355"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Smart Dashes" id="460">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Text Replacement" id="462">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Transformations" id="450">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Transformations" id="451">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Make Upper Case" id="452">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="uppercaseWord:" target="-1" id="464"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Make Lower Case" id="465">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="lowercaseWord:" target="-1" id="468"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Capitalize" id="466">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="capitalizeWord:" target="-1" id="467"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Speech" id="211">
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Speech" id="212">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Start Speaking" id="196">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="startSpeaking:" target="-1" id="233"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Stop Speaking" id="195">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="stopSpeaking:" target="-1" id="227"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                        </items>
 | 
				
			||||||
 | 
					                    </menu>
 | 
				
			||||||
 | 
					                </menuItem>
 | 
				
			||||||
 | 
					                <menuItem title="Format" id="375">
 | 
				
			||||||
 | 
					                    <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                    <menu key="submenu" title="Format" id="376">
 | 
				
			||||||
 | 
					                        <items>
 | 
				
			||||||
 | 
					                            <menuItem title="Font" id="377">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Font" systemMenu="font" id="388">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Show Fonts" keyEquivalent="t" id="389">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="orderFrontFontPanel:" target="420" id="424"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Bold" tag="2" keyEquivalent="b" id="390">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="addFontTrait:" target="420" id="421"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Italic" tag="1" keyEquivalent="i" id="391">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="addFontTrait:" target="420" id="422"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Underline" keyEquivalent="u" id="392">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="underline:" target="-1" id="432"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="393"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Bigger" tag="3" keyEquivalent="+" id="394">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="modifyFont:" target="420" id="425"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Smaller" tag="4" keyEquivalent="-" id="395">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="modifyFont:" target="420" id="423"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="396"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Kern" id="397">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <menu key="submenu" title="Kern" id="415">
 | 
				
			||||||
 | 
					                                                <items>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Use Default" id="416">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="useStandardKerning:" target="-1" id="438"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Use None" id="417">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="turnOffKerning:" target="-1" id="441"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Tighten" id="418">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="tightenKerning:" target="-1" id="431"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Loosen" id="419">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="loosenKerning:" target="-1" id="435"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                </items>
 | 
				
			||||||
 | 
					                                            </menu>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Ligature" id="398">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <menu key="submenu" title="Ligature" id="411">
 | 
				
			||||||
 | 
					                                                <items>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Use Default" id="412">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="useStandardLigatures:" target="-1" id="439"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Use None" id="413">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="turnOffLigatures:" target="-1" id="440"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Use All" id="414">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="useAllLigatures:" target="-1" id="434"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                </items>
 | 
				
			||||||
 | 
					                                            </menu>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Baseline" id="399">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <menu key="submenu" title="Baseline" id="405">
 | 
				
			||||||
 | 
					                                                <items>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Use Default" id="406">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="unscript:" target="-1" id="437"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Superscript" id="407">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="superscript:" target="-1" id="430"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Subscript" id="408">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="subscript:" target="-1" id="429"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Raise" id="409">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="raiseBaseline:" target="-1" id="426"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Lower" id="410">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="lowerBaseline:" target="-1" id="427"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                </items>
 | 
				
			||||||
 | 
					                                            </menu>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="400"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Show Colors" keyEquivalent="C" id="401">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="orderFrontColorPanel:" target="-1" id="433"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="402"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Copy Style" keyEquivalent="c" id="403">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="copyFont:" target="-1" id="428"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Paste Style" keyEquivalent="v" id="404">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="pasteFont:" target="-1" id="436"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Text" id="496">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                <menu key="submenu" title="Text" id="497">
 | 
				
			||||||
 | 
					                                    <items>
 | 
				
			||||||
 | 
					                                        <menuItem title="Align Left" keyEquivalent="{" id="498">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="alignLeft:" target="-1" id="524"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Center" keyEquivalent="|" id="499">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="alignCenter:" target="-1" id="518"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Justify" id="500">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="alignJustified:" target="-1" id="523"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Align Right" keyEquivalent="}" id="501">
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="alignRight:" target="-1" id="521"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="502"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Writing Direction" id="503">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <menu key="submenu" title="Writing Direction" id="508">
 | 
				
			||||||
 | 
					                                                <items>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Paragraph" enabled="NO" id="509">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem id="510">
 | 
				
			||||||
 | 
					                                                        <string key="title">	Default</string>
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem id="511">
 | 
				
			||||||
 | 
					                                                        <string key="title">	Left to Right</string>
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem id="512">
 | 
				
			||||||
 | 
					                                                        <string key="title">	Right to Left</string>
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem isSeparatorItem="YES" id="513"/>
 | 
				
			||||||
 | 
					                                                    <menuItem title="Selection" enabled="NO" id="514">
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem id="515">
 | 
				
			||||||
 | 
					                                                        <string key="title">	Default</string>
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem id="516">
 | 
				
			||||||
 | 
					                                                        <string key="title">	Left to Right</string>
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                    <menuItem id="517">
 | 
				
			||||||
 | 
					                                                        <string key="title">	Right to Left</string>
 | 
				
			||||||
 | 
					                                                        <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                                        <connections>
 | 
				
			||||||
 | 
					                                                            <action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/>
 | 
				
			||||||
 | 
					                                                        </connections>
 | 
				
			||||||
 | 
					                                                    </menuItem>
 | 
				
			||||||
 | 
					                                                </items>
 | 
				
			||||||
 | 
					                                            </menu>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem isSeparatorItem="YES" id="504"/>
 | 
				
			||||||
 | 
					                                        <menuItem title="Show Ruler" id="505">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="toggleRuler:" target="-1" id="520"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Copy Ruler" keyEquivalent="c" id="506">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="copyRuler:" target="-1" id="522"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                        <menuItem title="Paste Ruler" keyEquivalent="v" id="507">
 | 
				
			||||||
 | 
					                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                            <connections>
 | 
				
			||||||
 | 
					                                                <action selector="pasteRuler:" target="-1" id="519"/>
 | 
				
			||||||
 | 
					                                            </connections>
 | 
				
			||||||
 | 
					                                        </menuItem>
 | 
				
			||||||
 | 
					                                    </items>
 | 
				
			||||||
 | 
					                                </menu>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                        </items>
 | 
				
			||||||
 | 
					                    </menu>
 | 
				
			||||||
 | 
					                </menuItem>
 | 
				
			||||||
 | 
					                <menuItem title="View" id="295">
 | 
				
			||||||
 | 
					                    <menu key="submenu" title="View" id="296">
 | 
				
			||||||
 | 
					                        <items>
 | 
				
			||||||
 | 
					                            <menuItem title="Show Toolbar" keyEquivalent="t" id="297">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="toggleToolbarShown:" target="-1" id="366"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Customize Toolbar…" id="298">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="runToolbarCustomizationPalette:" target="-1" id="365"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                        </items>
 | 
				
			||||||
 | 
					                    </menu>
 | 
				
			||||||
 | 
					                </menuItem>
 | 
				
			||||||
 | 
					                <menuItem title="Window" id="19">
 | 
				
			||||||
 | 
					                    <menu key="submenu" title="Window" systemMenu="window" id="24">
 | 
				
			||||||
 | 
					                        <items>
 | 
				
			||||||
 | 
					                            <menuItem title="Minimize" keyEquivalent="m" id="23">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="performMiniaturize:" target="-1" id="37"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Zoom" id="239">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="performZoom:" target="-1" id="240"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem isSeparatorItem="YES" id="92">
 | 
				
			||||||
 | 
					                                <modifierMask key="keyEquivalentModifierMask" command="YES"/>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                            <menuItem title="Bring All to Front" id="5">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="arrangeInFront:" target="-1" id="39"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                        </items>
 | 
				
			||||||
 | 
					                    </menu>
 | 
				
			||||||
 | 
					                </menuItem>
 | 
				
			||||||
 | 
					                <menuItem title="Help" id="490">
 | 
				
			||||||
 | 
					                    <modifierMask key="keyEquivalentModifierMask"/>
 | 
				
			||||||
 | 
					                    <menu key="submenu" title="Help" systemMenu="help" id="491">
 | 
				
			||||||
 | 
					                        <items>
 | 
				
			||||||
 | 
					                            <menuItem title="QuietUnrar Help" keyEquivalent="?" id="492">
 | 
				
			||||||
 | 
					                                <connections>
 | 
				
			||||||
 | 
					                                    <action selector="showHelp:" target="-1" id="493"/>
 | 
				
			||||||
 | 
					                                </connections>
 | 
				
			||||||
 | 
					                            </menuItem>
 | 
				
			||||||
 | 
					                        </items>
 | 
				
			||||||
 | 
					                    </menu>
 | 
				
			||||||
 | 
					                </menuItem>
 | 
				
			||||||
 | 
					            </items>
 | 
				
			||||||
 | 
					            <point key="canvasLocation" x="140" y="154"/>
 | 
				
			||||||
 | 
					        </menu>
 | 
				
			||||||
 | 
					        <window title="QuietUnrar" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="371">
 | 
				
			||||||
 | 
					            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
 | 
				
			||||||
 | 
					            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
 | 
				
			||||||
 | 
					            <rect key="contentRect" x="335" y="390" width="480" height="360"/>
 | 
				
			||||||
 | 
					            <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
 | 
				
			||||||
 | 
					            <view key="contentView" id="372">
 | 
				
			||||||
 | 
					                <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
 | 
				
			||||||
 | 
					                <autoresizingMask key="autoresizingMask"/>
 | 
				
			||||||
 | 
					            </view>
 | 
				
			||||||
 | 
					        </window>
 | 
				
			||||||
 | 
					        <customObject id="494" customClass="QuietUnrarAppDelegate">
 | 
				
			||||||
 | 
					            <connections>
 | 
				
			||||||
 | 
					                <outlet property="window" destination="371" id="532"/>
 | 
				
			||||||
 | 
					            </connections>
 | 
				
			||||||
 | 
					        </customObject>
 | 
				
			||||||
 | 
					        <customObject id="420" customClass="NSFontManager"/>
 | 
				
			||||||
 | 
					    </objects>
 | 
				
			||||||
 | 
					</document>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,279 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
				
			||||||
 | 
					  <ItemGroup Label="ProjectConfigurations">
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|x64">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|x64">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="Globals">
 | 
				
			||||||
 | 
					    <ProjectGuid>{95CC809B-03FC-4EDB-BB20-FD07A698C05F}</ProjectGuid>
 | 
				
			||||||
 | 
					    <RootNamespace>UnRAR</RootNamespace>
 | 
				
			||||||
 | 
					    <Keyword>Win32Proj</Keyword>
 | 
				
			||||||
 | 
					    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionSettings">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="UserMacros" />
 | 
				
			||||||
 | 
					  <PropertyGroup>
 | 
				
			||||||
 | 
					    <_ProjectFileVersion>14.0.24720.0</_ProjectFileVersion>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrar32\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrar32\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>true</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>false</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrar64\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrar64\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>true</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>false</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrar32\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrar32\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>false</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrar64\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrar64\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>false</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>Disabled</Optimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>StdCall</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <Midl>
 | 
				
			||||||
 | 
					      <TargetEnvironment>X64</TargetEnvironment>
 | 
				
			||||||
 | 
					    </Midl>
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>Disabled</Optimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>StdCall</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX64</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>MaxSpeed</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
 | 
				
			||||||
 | 
					      <OmitFramePointers>true</OmitFramePointers>
 | 
				
			||||||
 | 
					      <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <StructMemberAlignment>Default</StructMemberAlignment>
 | 
				
			||||||
 | 
					      <BufferSecurityCheck>true</BufferSecurityCheck>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					      <FloatingPointModel>Precise</FloatingPointModel>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>StdCall</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <LinkTimeCodeGeneration />
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <Midl>
 | 
				
			||||||
 | 
					      <TargetEnvironment>X64</TargetEnvironment>
 | 
				
			||||||
 | 
					    </Midl>
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>MinSpace</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
 | 
				
			||||||
 | 
					      <OmitFramePointers>true</OmitFramePointers>
 | 
				
			||||||
 | 
					      <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <StringPooling>false</StringPooling>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <BufferSecurityCheck>true</BufferSecurityCheck>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>StdCall</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <LinkTimeCodeGeneration />
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX64</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClCompile Include="archive.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="arcread.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="blake2s.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="cmddata.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="consio.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="crc.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="crypt.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="encname.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="errhnd.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="extinfo.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="extract.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="filcreat.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="file.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="filefn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="filestr.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="find.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="getbits.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="global.cpp">
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <ClCompile Include="hash.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="headers.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="isnt.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="list.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="match.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="options.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="pathfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="qopen.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rar.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rarpch.cpp">
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <ClCompile Include="rarvm.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rawread.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rdwrfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="recvol.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="resource.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rijndael.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rs.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rs16.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="scantree.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="secpassword.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="sha1.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="sha256.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="smallfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="strfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="strlist.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="system.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="threadpool.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="timefn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="ui.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="unicode.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="unpack.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="volume.cpp" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionTargets">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,420 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
				
			||||||
 | 
					  <ItemGroup Label="ProjectConfigurations">
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|x64">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="release_nocrypt|Win32">
 | 
				
			||||||
 | 
					      <Configuration>release_nocrypt</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="release_nocrypt|x64">
 | 
				
			||||||
 | 
					      <Configuration>release_nocrypt</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|x64">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="Globals">
 | 
				
			||||||
 | 
					    <ProjectName>UnRAR</ProjectName>
 | 
				
			||||||
 | 
					    <ProjectGuid>{E815C46C-36C4-499F-BBC2-E772C6B17971}</ProjectGuid>
 | 
				
			||||||
 | 
					    <RootNamespace>UnRAR</RootNamespace>
 | 
				
			||||||
 | 
					    <Keyword>Win32Proj</Keyword>
 | 
				
			||||||
 | 
					    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>DynamicLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>DynamicLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>DynamicLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>DynamicLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>DynamicLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>DynamicLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140_xp</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>MultiByte</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionSettings">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="UserMacros" />
 | 
				
			||||||
 | 
					  <PropertyGroup>
 | 
				
			||||||
 | 
					    <_ProjectFileVersion>14.0.24720.0</_ProjectFileVersion>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrardll32\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>true</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>true</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrardll64\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>true</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>true</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrardll32\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>true</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrardll64\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>true</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrardll32\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>true</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
 | 
				
			||||||
 | 
					    <OutDir>build\unrardll64\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					    <GenerateManifest>true</GenerateManifest>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>Disabled</Optimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <ExceptionHandling>Sync</ExceptionHandling>
 | 
				
			||||||
 | 
					      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <StructMemberAlignment>4Bytes</StructMemberAlignment>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>Cdecl</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <OutputFile>$(OutDir)unrar.dll</OutputFile>
 | 
				
			||||||
 | 
					      <ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <Midl>
 | 
				
			||||||
 | 
					      <TargetEnvironment>X64</TargetEnvironment>
 | 
				
			||||||
 | 
					    </Midl>
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>Disabled</Optimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <ExceptionHandling>Sync</ExceptionHandling>
 | 
				
			||||||
 | 
					      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <StructMemberAlignment>4Bytes</StructMemberAlignment>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>Cdecl</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <OutputFile>$(OutDir)unrar.dll</OutputFile>
 | 
				
			||||||
 | 
					      <ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX64</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>MaxSpeed</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
 | 
				
			||||||
 | 
					      <OmitFramePointers>true</OmitFramePointers>
 | 
				
			||||||
 | 
					      <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <ExceptionHandling>Sync</ExceptionHandling>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <StructMemberAlignment>4Bytes</StructMemberAlignment>
 | 
				
			||||||
 | 
					      <BufferSecurityCheck>true</BufferSecurityCheck>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					      <FloatingPointModel>Precise</FloatingPointModel>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>Cdecl</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <OutputFile>$(OutDir)unrar.dll</OutputFile>
 | 
				
			||||||
 | 
					      <ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <LinkTimeCodeGeneration />
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <Midl>
 | 
				
			||||||
 | 
					      <TargetEnvironment>X64</TargetEnvironment>
 | 
				
			||||||
 | 
					    </Midl>
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>MaxSpeed</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
 | 
				
			||||||
 | 
					      <OmitFramePointers>true</OmitFramePointers>
 | 
				
			||||||
 | 
					      <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <StringPooling>false</StringPooling>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <ExceptionHandling>Sync</ExceptionHandling>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <StructMemberAlignment>4Bytes</StructMemberAlignment>
 | 
				
			||||||
 | 
					      <BufferSecurityCheck>true</BufferSecurityCheck>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>Cdecl</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <OutputFile>$(OutDir)unrar.dll</OutputFile>
 | 
				
			||||||
 | 
					      <ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <LinkTimeCodeGeneration />
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX64</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>MaxSpeed</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
 | 
				
			||||||
 | 
					      <OmitFramePointers>true</OmitFramePointers>
 | 
				
			||||||
 | 
					      <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <ExceptionHandling>Sync</ExceptionHandling>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <StructMemberAlignment>4Bytes</StructMemberAlignment>
 | 
				
			||||||
 | 
					      <BufferSecurityCheck>true</BufferSecurityCheck>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					      <FloatingPointModel>Precise</FloatingPointModel>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>Cdecl</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <OutputFile>$(OutDir)unrar.dll</OutputFile>
 | 
				
			||||||
 | 
					      <ModuleDefinitionFile>dll_nocrypt.def</ModuleDefinitionFile>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <LinkTimeCodeGeneration />
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
 | 
				
			||||||
 | 
					    <Midl>
 | 
				
			||||||
 | 
					      <TargetEnvironment>X64</TargetEnvironment>
 | 
				
			||||||
 | 
					    </Midl>
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
 | 
				
			||||||
 | 
					      <Optimization>MaxSpeed</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
 | 
				
			||||||
 | 
					      <OmitFramePointers>true</OmitFramePointers>
 | 
				
			||||||
 | 
					      <WholeProgramOptimization>false</WholeProgramOptimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <StringPooling>false</StringPooling>
 | 
				
			||||||
 | 
					      <MinimalRebuild>false</MinimalRebuild>
 | 
				
			||||||
 | 
					      <ExceptionHandling>Sync</ExceptionHandling>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <StructMemberAlignment>4Bytes</StructMemberAlignment>
 | 
				
			||||||
 | 
					      <BufferSecurityCheck>true</BufferSecurityCheck>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <RuntimeTypeInfo>false</RuntimeTypeInfo>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>Use</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <CallingConvention>StdCall</CallingConvention>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <OutputFile>$(OutDir)unrar.dll</OutputFile>
 | 
				
			||||||
 | 
					      <ModuleDefinitionFile>dll_nocrypt.def</ModuleDefinitionFile>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <LinkTimeCodeGeneration />
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX64</TargetMachine>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClCompile Include="archive.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="arcread.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="blake2s.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="cmddata.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="consio.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="crc.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="crypt.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="dll.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="encname.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="errhnd.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="extinfo.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="extract.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="filcreat.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="file.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="filefn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="filestr.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="find.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="getbits.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="global.cpp">
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <ClCompile Include="hash.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="headers.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="isnt.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="match.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="options.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="pathfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="qopen.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rar.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rarpch.cpp">
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">Create</PrecompiledHeader>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <ClCompile Include="rarvm.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rawread.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rdwrfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rijndael.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rs.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="rs16.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="scantree.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="secpassword.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="sha1.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="sha256.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="smallfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="strfn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="strlist.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="system.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="threadpool.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="timefn.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="ui.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="unicode.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="unpack.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="volume.cpp" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClInclude Include="rar.hpp" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ResourceCompile Include="dll.rc" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionTargets">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,92 @@
 | 
				
			||||||
 | 
					                           ACKNOWLEDGMENTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* We used "Screaming Fast Galois Field Arithmetic Using Intel
 | 
				
			||||||
 | 
					  SIMD Instructions" paper by James S. Plank, Kevin M. Greenan
 | 
				
			||||||
 | 
					  and Ethan L. Miller to improve Reed-Solomon coding performance.
 | 
				
			||||||
 | 
					  Also we are grateful to Artem Drobanov and Bulat Ziganshin
 | 
				
			||||||
 | 
					  for samples and ideas allowed to make Reed-Solomon coding
 | 
				
			||||||
 | 
					  more efficient.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* RAR text compression algorithm is based on Dmitry Shkarin PPMII
 | 
				
			||||||
 | 
					  and Dmitry Subbotin carryless rangecoder public domain source code.
 | 
				
			||||||
 | 
					  You may find it in ftp.elf.stuba.sk/pub/pc/pack.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* RAR encryption includes parts of code from Szymon Stefanek
 | 
				
			||||||
 | 
					  and Brian Gladman AES implementations also as Steve Reid SHA-1 source.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.
 | 
				
			||||||
 | 
					  All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LICENSE TERMS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The free distribution and use of this software in both source and binary
 | 
				
			||||||
 | 
					  form is allowed (with or without changes) provided that:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    1. distributions of this source code include the above copyright
 | 
				
			||||||
 | 
					       notice, this list of conditions and the following disclaimer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    2. distributions in binary form include the above copyright
 | 
				
			||||||
 | 
					       notice, this list of conditions and the following disclaimer
 | 
				
			||||||
 | 
					       in the documentation and/or other associated materials;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    3. the copyright holder's name is not used to endorse products
 | 
				
			||||||
 | 
					       built using this software without specific written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ALTERNATIVELY, provided that this notice is retained in full, this product
 | 
				
			||||||
 | 
					  may be distributed under the terms of the GNU General Public License (GPL),
 | 
				
			||||||
 | 
					  in which case the provisions of the GPL apply INSTEAD OF those given above.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DISCLAIMER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This software is provided 'as is' with no explicit or implied warranties
 | 
				
			||||||
 | 
					  in respect of its properties, including, but not limited to, correctness
 | 
				
			||||||
 | 
					  and/or fitness for purpose.
 | 
				
			||||||
 | 
					  ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Source code of this package also as other cryptographic technology
 | 
				
			||||||
 | 
					  and computing project related links are available on Brian Gladman's
 | 
				
			||||||
 | 
					  web site: http://www.gladman.me.uk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* RAR uses CRC32 function based on Intel Slicing-by-8 algorithm.
 | 
				
			||||||
 | 
					  Original Intel Slicing-by-8 code is available here:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://sourceforge.net/projects/slicing-by-8/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Original Intel Slicing-by-8 code is licensed under BSD License
 | 
				
			||||||
 | 
					  available at http://www.opensource.org/licenses/bsd-license.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Copyright (c) 2004-2006 Intel Corporation. 
 | 
				
			||||||
 | 
					    All Rights Reserved
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					    modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					    are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Redistributions of source code must retain the above copyright notice,
 | 
				
			||||||
 | 
					    this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					    notice, this list of conditions and the following disclaimer
 | 
				
			||||||
 | 
					    in the documentation and/or other materials provided with
 | 
				
			||||||
 | 
					    the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
				
			||||||
 | 
					    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
				
			||||||
 | 
					    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
				
			||||||
 | 
					    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
				
			||||||
 | 
					    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
				
			||||||
 | 
					    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | 
				
			||||||
 | 
					    OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					    SUCH DAMAGE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* RAR archives may optionally include BLAKE2sp hash ( https://blake2.net ),
 | 
				
			||||||
 | 
					  designed by Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn
 | 
				
			||||||
 | 
					  and Christian Winnerlein.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Useful hints provided by Alexander Khoroshev and Bulat Ziganshin allowed
 | 
				
			||||||
 | 
					  to significantly improve RAR compression and speed.
 | 
				
			||||||
| 
						 | 
					@ -1,59 +1,74 @@
 | 
				
			||||||
bool Archive::GetComment(Array<byte> *CmtData,Array<wchar> *CmtDataW)
 | 
					static bool IsAnsiEscComment(const wchar *Data,size_t Size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Archive::GetComment(Array<wchar> *CmtData)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (!MainComment)
 | 
					  if (!MainComment)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  SaveFilePos SavePos(*this);
 | 
					  int64 SavePos=Tell();
 | 
				
			||||||
 | 
					  bool Success=DoGetComment(CmtData);
 | 
				
			||||||
 | 
					  Seek(SavePos,SEEK_SET);
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Archive::DoGetComment(Array<wchar> *CmtData)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
  ushort CmtLength;
 | 
					  uint CmtLength;
 | 
				
			||||||
  if (OldFormat)
 | 
					  if (Format==RARFMT14)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    Seek(SFXSize+SIZEOF_OLDMHD,SEEK_SET);
 | 
					    Seek(SFXSize+SIZEOF_MAINHEAD14,SEEK_SET);
 | 
				
			||||||
    CmtLength=GetByte();
 | 
					    CmtLength=GetByte();
 | 
				
			||||||
    CmtLength+=(GetByte()<<8);
 | 
					    CmtLength+=(GetByte()<<8);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (NewMhd.Flags & MHD_COMMENT)
 | 
					    if (MainHead.CommentInHeader)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      Seek(SFXSize+SIZEOF_MARKHEAD+SIZEOF_NEWMHD,SEEK_SET);
 | 
					      // Old style (RAR 2.9) archive comment embedded into the main 
 | 
				
			||||||
      ReadHeader();
 | 
					      // archive header.
 | 
				
			||||||
 | 
					      Seek(SFXSize+SIZEOF_MARKHEAD3+SIZEOF_MAINHEAD3,SEEK_SET);
 | 
				
			||||||
 | 
					      if (!ReadHeader() || GetHeaderType()!=HEAD3_CMT)
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      Seek(SFXSize+SIZEOF_MARKHEAD+NewMhd.HeadSize,SEEK_SET);
 | 
					      // Current (RAR 3.0+) version of archive comment.
 | 
				
			||||||
      return(SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData,CmtDataW)!=0);
 | 
					      Seek(GetStartPos(),SEEK_SET);
 | 
				
			||||||
 | 
					      return SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
    if (CommHead.HeadCRC!=HeaderCRC)
 | 
					    // Old style (RAR 2.9) comment header embedded into the main 
 | 
				
			||||||
 | 
					    // archive header.
 | 
				
			||||||
 | 
					    if (BrokenHeader || CommHead.HeadSize<SIZEOF_COMMHEAD)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      Log(FileName,St(MLogCommHead));
 | 
					      uiMsg(UIERROR_CMTBROKEN,FileName);
 | 
				
			||||||
      Alarm();
 | 
					      return false;
 | 
				
			||||||
      return(false);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    CmtLength=CommHead.HeadSize-SIZEOF_COMMHEAD;
 | 
					    CmtLength=CommHead.HeadSize-SIZEOF_COMMHEAD;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
  if (OldFormat && (OldMhd.Flags & MHD_PACK_COMMENT) || !OldFormat && CommHead.Method!=0x30)
 | 
					  if (Format==RARFMT14 && MainHead.PackComment || Format!=RARFMT14 && CommHead.Method!=0x30)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (!OldFormat && (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || CommHead.Method > 0x35))
 | 
					    if (Format!=RARFMT14 && (CommHead.UnpVer < 15 || CommHead.UnpVer > VER_UNPACK || CommHead.Method > 0x35))
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
    ComprDataIO DataIO;
 | 
					    ComprDataIO DataIO;
 | 
				
			||||||
    Unpack Unpack(&DataIO);
 | 
					 | 
				
			||||||
    Unpack.Init();
 | 
					 | 
				
			||||||
    DataIO.SetTestMode(true);
 | 
					    DataIO.SetTestMode(true);
 | 
				
			||||||
    uint UnpCmtLength;
 | 
					    uint UnpCmtLength;
 | 
				
			||||||
    if (OldFormat)
 | 
					    if (Format==RARFMT14)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
#ifdef NOCRYPT
 | 
					#ifdef RAR_NOCRYPT
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
      UnpCmtLength=GetByte();
 | 
					      UnpCmtLength=GetByte();
 | 
				
			||||||
      UnpCmtLength+=(GetByte()<<8);
 | 
					      UnpCmtLength+=(GetByte()<<8);
 | 
				
			||||||
 | 
					      if (CmtLength<2)
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
      CmtLength-=2;
 | 
					      CmtLength-=2;
 | 
				
			||||||
      DataIO.SetCmt13Encryption();
 | 
					      DataIO.SetCmt13Encryption();
 | 
				
			||||||
 | 
					      CommHead.UnpVer=15;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
| 
						 | 
					@ -61,157 +76,110 @@ bool Archive::GetComment(Array<byte> *CmtData,Array<wchar> *CmtDataW)
 | 
				
			||||||
    DataIO.SetFiles(this,NULL);
 | 
					    DataIO.SetFiles(this,NULL);
 | 
				
			||||||
    DataIO.EnableShowProgress(false);
 | 
					    DataIO.EnableShowProgress(false);
 | 
				
			||||||
    DataIO.SetPackedSizeToRead(CmtLength);
 | 
					    DataIO.SetPackedSizeToRead(CmtLength);
 | 
				
			||||||
    Unpack.SetDestSize(UnpCmtLength);
 | 
					    DataIO.UnpHash.Init(HASH_CRC32,1);
 | 
				
			||||||
    Unpack.DoUnpack(CommHead.UnpVer,false);
 | 
					    DataIO.SetNoFileHeader(true); // this->FileHead is not filled yet.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!OldFormat && ((~DataIO.UnpFileCRC)&0xffff)!=CommHead.CommCRC)
 | 
					    Unpack CmtUnpack(&DataIO);
 | 
				
			||||||
 | 
					    CmtUnpack.Init(0x10000,false);
 | 
				
			||||||
 | 
					    CmtUnpack.SetDestSize(UnpCmtLength);
 | 
				
			||||||
 | 
					    CmtUnpack.DoUnpack(CommHead.UnpVer,false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Format!=RARFMT14 && (DataIO.UnpHash.GetCRC32()&0xffff)!=CommHead.CommCRC)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      Log(FileName,St(MLogCommBrk));
 | 
					      uiMsg(UIERROR_CMTBROKEN,FileName);
 | 
				
			||||||
      Alarm();
 | 
					      return false;
 | 
				
			||||||
      return(false);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      byte *UnpData;
 | 
					      byte *UnpData;
 | 
				
			||||||
      size_t UnpDataSize;
 | 
					      size_t UnpDataSize;
 | 
				
			||||||
      DataIO.GetUnpackedData(&UnpData,&UnpDataSize);
 | 
					      DataIO.GetUnpackedData(&UnpData,&UnpDataSize);
 | 
				
			||||||
      CmtData->Alloc(UnpDataSize);
 | 
					      if (UnpDataSize>0)
 | 
				
			||||||
      memcpy(&((*CmtData)[0]),UnpData,UnpDataSize);
 | 
					      {
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					        // If we ever decide to extend it to Android, we'll need to alloc
 | 
				
			||||||
 | 
					        // 4x memory for OEM to UTF-8 output here.
 | 
				
			||||||
 | 
					        OemToCharBuffA((char *)UnpData,(char *)UnpData,(DWORD)UnpDataSize);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        CmtData->Alloc(UnpDataSize+1);
 | 
				
			||||||
 | 
					        memset(CmtData->Addr(0),0,CmtData->Size()*sizeof(wchar));
 | 
				
			||||||
 | 
					        CharToWide((char *)UnpData,CmtData->Addr(0),CmtData->Size());
 | 
				
			||||||
 | 
					        CmtData->Alloc(wcslen(CmtData->Addr(0)));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    CmtData->Alloc(CmtLength);
 | 
					    if (CmtLength==0)
 | 
				
			||||||
    
 | 
					      return false;
 | 
				
			||||||
    Read(&((*CmtData)[0]),CmtLength);
 | 
					    Array<byte> CmtRaw(CmtLength);
 | 
				
			||||||
    if (!OldFormat && CommHead.CommCRC!=(~CRC(0xffffffff,&((*CmtData)[0]),CmtLength)&0xffff))
 | 
					    int ReadSize=Read(&CmtRaw[0],CmtLength);
 | 
				
			||||||
 | 
					    if (ReadSize>=0 && (uint)ReadSize<CmtLength) // Comment is shorter than declared.
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      Log(FileName,St(MLogCommBrk));
 | 
					      CmtLength=ReadSize;
 | 
				
			||||||
      Alarm();
 | 
					      CmtRaw.Alloc(CmtLength);
 | 
				
			||||||
      CmtData->Reset();
 | 
					 | 
				
			||||||
      return(false);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Format!=RARFMT14 && CommHead.CommCRC!=(~CRC32(0xffffffff,&CmtRaw[0],CmtLength)&0xffff))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      uiMsg(UIERROR_CMTBROKEN,FileName);
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    CmtData->Alloc(CmtLength+1);
 | 
				
			||||||
 | 
					    CmtRaw.Push(0);
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					    // If we ever decide to extend it to Android, we'll need to alloc
 | 
				
			||||||
 | 
					    // 4x memory for OEM to UTF-8 output here.
 | 
				
			||||||
 | 
					    OemToCharA((char *)&CmtRaw[0],(char *)&CmtRaw[0]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    CharToWide((char *)&CmtRaw[0],CmtData->Addr(0),CmtData->Size());
 | 
				
			||||||
 | 
					    CmtData->Alloc(wcslen(CmtData->Addr(0)));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					  return CmtData->Size() > 0;
 | 
				
			||||||
  if (CmtData->Size()>0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    size_t CmtSize=CmtData->Size();
 | 
					 | 
				
			||||||
    OemToCharBuff((char *)CmtData->Addr(),(char *)CmtData->Addr(),(DWORD)CmtSize);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (CmtDataW!=NULL)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      CmtDataW->Alloc(CmtSize+1);
 | 
					 | 
				
			||||||
      CmtData->Push(0);
 | 
					 | 
				
			||||||
      CharToWide((char *)CmtData->Addr(),CmtDataW->Addr(),CmtSize+1);
 | 
					 | 
				
			||||||
      CmtData->Alloc(CmtSize);
 | 
					 | 
				
			||||||
      CmtDataW->Alloc(strlenw(CmtDataW->Addr()));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  return(CmtData->Size()>0);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t Archive::ReadCommentData(Array<byte> *CmtData,Array<wchar> *CmtDataW)
 | 
					bool Archive::ReadCommentData(Array<wchar> *CmtData)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  bool Unicode=SubHead.SubFlags & SUBHEAD_FLAGS_CMT_UNICODE;
 | 
					  Array<byte> CmtRaw;
 | 
				
			||||||
  if (!ReadSubData(CmtData,NULL))
 | 
					  if (!ReadSubData(&CmtRaw,NULL,false))
 | 
				
			||||||
    return(0);
 | 
					    return false;
 | 
				
			||||||
  size_t CmtSize=CmtData->Size();
 | 
					  size_t CmtSize=CmtRaw.Size();
 | 
				
			||||||
  if (Unicode)
 | 
					  CmtRaw.Push(0);
 | 
				
			||||||
  {
 | 
					  CmtData->Alloc(CmtSize+1);
 | 
				
			||||||
    CmtSize/=2;
 | 
					  if (Format==RARFMT50)
 | 
				
			||||||
    Array<wchar> DataW(CmtSize+1);
 | 
					    UtfToWide((char *)&CmtRaw[0],CmtData->Addr(0),CmtData->Size());
 | 
				
			||||||
    RawToWide(CmtData->Addr(),DataW.Addr(),CmtSize);
 | 
					 | 
				
			||||||
    DataW[CmtSize]=0;
 | 
					 | 
				
			||||||
    size_t DestSize=CmtSize*4;
 | 
					 | 
				
			||||||
    CmtData->Alloc(DestSize+1);
 | 
					 | 
				
			||||||
    WideToChar(DataW.Addr(),(char *)CmtData->Addr(),DestSize);
 | 
					 | 
				
			||||||
    (*CmtData)[DestSize]=0;
 | 
					 | 
				
			||||||
    CmtSize=strlen((char *)CmtData->Addr());
 | 
					 | 
				
			||||||
    CmtData->Alloc(CmtSize);
 | 
					 | 
				
			||||||
    if (CmtDataW!=NULL)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      *CmtDataW=DataW;
 | 
					 | 
				
			||||||
      CmtDataW->Alloc(CmtSize);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    if (CmtDataW!=NULL)
 | 
					    if ((SubHead.SubFlags & SUBHEAD_FLAGS_CMT_UNICODE)!=0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      CmtData->Push(0);
 | 
					      RawToWide(&CmtRaw[0],CmtData->Addr(0),CmtSize/2);
 | 
				
			||||||
      CmtDataW->Alloc(CmtSize+1);
 | 
					      (*CmtData)[CmtSize/2]=0;
 | 
				
			||||||
      CharToWide((char *)CmtData->Addr(),CmtDataW->Addr(),CmtSize+1);
 | 
					
 | 
				
			||||||
      CmtData->Alloc(CmtSize);
 | 
					 | 
				
			||||||
      CmtDataW->Alloc(strlenw(CmtDataW->Addr()));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  return(CmtSize);
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      CharToWide((char *)&CmtRaw[0],CmtData->Addr(0),CmtData->Size());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  CmtData->Alloc(wcslen(CmtData->Addr(0))); // Set buffer size to actual comment length.
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Archive::ViewComment()
 | 
					void Archive::ViewComment()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef GUI
 | 
					 | 
				
			||||||
  if (Cmd->DisableComment)
 | 
					  if (Cmd->DisableComment)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  Array<byte> CmtBuf;
 | 
					  Array<wchar> CmtBuf;
 | 
				
			||||||
  if (GetComment(&CmtBuf,NULL))
 | 
					  if (GetComment(&CmtBuf)) // In GUI too, so "Test" command detects broken comments.
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    size_t CmtSize=CmtBuf.Size();
 | 
					    size_t CmtSize=CmtBuf.Size();
 | 
				
			||||||
    char *ChPtr=(char *)memchr(&CmtBuf[0],0x1A,CmtSize);
 | 
					    wchar *ChPtr=wcschr(&CmtBuf[0],0x1A);
 | 
				
			||||||
    if (ChPtr!=NULL)
 | 
					    if (ChPtr!=NULL)
 | 
				
			||||||
      CmtSize=ChPtr-(char *)&CmtBuf[0];
 | 
					      CmtSize=ChPtr-&CmtBuf[0];
 | 
				
			||||||
    mprintf("\n");
 | 
					    mprintf(L"\n");
 | 
				
			||||||
    OutComment((char *)&CmtBuf[0],CmtSize);
 | 
					    OutComment(&CmtBuf[0],CmtSize);
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
void Archive::ViewFileComment()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (!(NewLhd.Flags & LHD_COMMENT) || Cmd->DisableComment || OldFormat)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
#ifndef GUI
 | 
					 | 
				
			||||||
  mprintf(St(MFileComment));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  const int MaxSize=0x8000;
 | 
					 | 
				
			||||||
  Array<char> CmtBuf(MaxSize);
 | 
					 | 
				
			||||||
  SaveFilePos SavePos(*this);
 | 
					 | 
				
			||||||
  Seek(CurBlockPos+SIZEOF_NEWLHD+NewLhd.NameSize,SEEK_SET);
 | 
					 | 
				
			||||||
  int64 SaveCurBlockPos=CurBlockPos;
 | 
					 | 
				
			||||||
  int64 SaveNextBlockPos=NextBlockPos;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  size_t Size=ReadHeader();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CurBlockPos=SaveCurBlockPos;
 | 
					 | 
				
			||||||
  NextBlockPos=SaveNextBlockPos;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Size<7 || CommHead.HeadType!=COMM_HEAD)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  if (CommHead.HeadCRC!=HeaderCRC)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
#ifndef GUI
 | 
					 | 
				
			||||||
    Log(FileName,St(MLogCommHead));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  if (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER ||
 | 
					 | 
				
			||||||
      CommHead.Method > 0x30 || CommHead.UnpSize > MaxSize)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  Read(&CmtBuf[0],CommHead.UnpSize);
 | 
					 | 
				
			||||||
  if (CommHead.CommCRC!=((~CRC(0xffffffff,&CmtBuf[0],CommHead.UnpSize)&0xffff)))
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(FileName,St(MLogBrokFCmt));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    OutComment(&CmtBuf[0],CommHead.UnpSize);
 | 
					 | 
				
			||||||
#ifndef GUI
 | 
					 | 
				
			||||||
    mprintf("\n");
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,133 +1,150 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SHELL_EXT
 | 
					 | 
				
			||||||
#include "arccmt.cpp"
 | 
					#include "arccmt.cpp"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Archive::Archive(RAROptions *InitCmd)
 | 
					Archive::Archive(RAROptions *InitCmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Cmd=InitCmd==NULL ? &DummyCmd:InitCmd;
 | 
					  Cmd=NULL; // Just in case we'll have an exception in 'new' below.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DummyCmd=(InitCmd==NULL);
 | 
				
			||||||
 | 
					  Cmd=DummyCmd ? (new RAROptions):InitCmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  OpenShared=Cmd->OpenShared;
 | 
					  OpenShared=Cmd->OpenShared;
 | 
				
			||||||
  OldFormat=false;
 | 
					  Format=RARFMT15;
 | 
				
			||||||
  Solid=false;
 | 
					  Solid=false;
 | 
				
			||||||
  Volume=false;
 | 
					  Volume=false;
 | 
				
			||||||
  MainComment=false;
 | 
					  MainComment=false;
 | 
				
			||||||
  Locked=false;
 | 
					  Locked=false;
 | 
				
			||||||
  Signed=false;
 | 
					  Signed=false;
 | 
				
			||||||
  NotFirstVolume=false;
 | 
					  FirstVolume=false;
 | 
				
			||||||
 | 
					  NewNumbering=false;
 | 
				
			||||||
  SFXSize=0;
 | 
					  SFXSize=0;
 | 
				
			||||||
  LatestTime.Reset();
 | 
					  LatestTime.Reset();
 | 
				
			||||||
  Protected=false;
 | 
					  Protected=false;
 | 
				
			||||||
  Encrypted=false;
 | 
					  Encrypted=false;
 | 
				
			||||||
  BrokenFileHeader=false;
 | 
					  FailedHeaderDecryption=false;
 | 
				
			||||||
 | 
					  BrokenHeader=false;
 | 
				
			||||||
  LastReadBlock=0;
 | 
					  LastReadBlock=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CurBlockPos=0;
 | 
					  CurBlockPos=0;
 | 
				
			||||||
  NextBlockPos=0;
 | 
					  NextBlockPos=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  RecoveryPos=SIZEOF_MARKHEAD;
 | 
					 | 
				
			||||||
  RecoverySectors=-1;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  memset(&NewMhd,0,sizeof(NewMhd));
 | 
					  memset(&MainHead,0,sizeof(MainHead));
 | 
				
			||||||
  NewMhd.HeadType=MAIN_HEAD;
 | 
					  memset(&CryptHead,0,sizeof(CryptHead));
 | 
				
			||||||
  NewMhd.HeadSize=SIZEOF_NEWMHD;
 | 
					  memset(&EndArcHead,0,sizeof(EndArcHead));
 | 
				
			||||||
  HeaderCRC=0;
 | 
					
 | 
				
			||||||
 | 
					  VolNumber=0;
 | 
				
			||||||
  VolWrite=0;
 | 
					  VolWrite=0;
 | 
				
			||||||
  AddingFilesSize=0;
 | 
					  AddingFilesSize=0;
 | 
				
			||||||
  AddingHeadersSize=0;
 | 
					  AddingHeadersSize=0;
 | 
				
			||||||
#if !defined(SHELL_EXT) && !defined(NOCRYPT)
 | 
					 | 
				
			||||||
  *HeadersSalt=0;
 | 
					 | 
				
			||||||
  *SubDataSalt=0;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  *FirstVolumeName=0;
 | 
					  *FirstVolumeName=0;
 | 
				
			||||||
  *FirstVolumeNameW=0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Splitting=false;
 | 
					  Splitting=false;
 | 
				
			||||||
  NewArchive=false;
 | 
					  NewArchive=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SilentOpen=false;
 | 
					  SilentOpen=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef USE_QOPEN
 | 
				
			||||||
 | 
					  ProhibitQOpen=false;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Archive::~Archive()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (DummyCmd)
 | 
				
			||||||
 | 
					    delete Cmd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SHELL_EXT
 | 
					 | 
				
			||||||
void Archive::CheckArc(bool EnableBroken)
 | 
					void Archive::CheckArc(bool EnableBroken)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (!IsArchive(EnableBroken))
 | 
					  if (!IsArchive(EnableBroken))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    Log(FileName,St(MBadArc),FileName);
 | 
					    // If FailedHeaderDecryption is set, we already reported that archive
 | 
				
			||||||
    ErrHandler.Exit(FATAL_ERROR);
 | 
					    // password is incorrect.
 | 
				
			||||||
 | 
					    if (!FailedHeaderDecryption)
 | 
				
			||||||
 | 
					      uiMsg(UIERROR_BADARCHIVE,FileName);
 | 
				
			||||||
 | 
					    ErrHandler.Exit(RARX_FATAL);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(SHELL_EXT) && !defined(SFX_MODULE)
 | 
					#if !defined(SFX_MODULE)
 | 
				
			||||||
void Archive::CheckOpen(char *Name,wchar *NameW)
 | 
					void Archive::CheckOpen(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  TOpen(Name,NameW);
 | 
					  TOpen(Name);
 | 
				
			||||||
  CheckArc(false);
 | 
					  CheckArc(false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Archive::WCheckOpen(char *Name,wchar *NameW)
 | 
					bool Archive::WCheckOpen(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (!WOpen(Name,NameW))
 | 
					  if (!WOpen(Name))
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  if (!IsArchive(false))
 | 
					  if (!IsArchive(false))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
#ifndef SHELL_EXT
 | 
					    uiMsg(UIERROR_BADARCHIVE,FileName);
 | 
				
			||||||
    Log(FileName,St(MNotRAR),FileName);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    Close();
 | 
					    Close();
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(true);
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Archive::IsSignature(byte *D)
 | 
					RARFORMAT Archive::IsSignature(const byte *D,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  bool Valid=false;
 | 
					  RARFORMAT Type=RARFMT_NONE;
 | 
				
			||||||
  if (D[0]==0x52)
 | 
					  if (Size>=1 && D[0]==0x52)
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
    if (D[1]==0x45 && D[2]==0x7e && D[3]==0x5e)
 | 
					    if (Size>=4 && D[1]==0x45 && D[2]==0x7e && D[3]==0x5e)
 | 
				
			||||||
    {
 | 
					      Type=RARFMT14;
 | 
				
			||||||
      OldFormat=true;
 | 
					 | 
				
			||||||
      Valid=true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
      if (D[1]==0x61 && D[2]==0x72 && D[3]==0x21 && D[4]==0x1a && D[5]==0x07 && D[6]==0x00)
 | 
					      if (Size>=7 && D[1]==0x61 && D[2]==0x72 && D[3]==0x21 && D[4]==0x1a && D[5]==0x07)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        OldFormat=false;
 | 
					        // We check the last signature byte, so we can return a sensible
 | 
				
			||||||
        Valid=true;
 | 
					        // warning in case we'll want to change the archive format
 | 
				
			||||||
 | 
					        // sometimes in the future.
 | 
				
			||||||
 | 
					        if (D[6]==0)
 | 
				
			||||||
 | 
					          Type=RARFMT15;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          if (D[6]==1)
 | 
				
			||||||
 | 
					            Type=RARFMT50;
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            if (D[6]>1 && D[6]<5)
 | 
				
			||||||
 | 
					              Type=RARFMT_FUTURE;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
  return(Valid);
 | 
					  return Type;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Archive::IsArchive(bool EnableBroken)
 | 
					bool Archive::IsArchive(bool EnableBroken)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Encrypted=false;
 | 
					  Encrypted=false;
 | 
				
			||||||
 | 
					  BrokenHeader=false; // Might be left from previous volume.
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
  if (IsDevice())
 | 
					  if (IsDevice())
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
#ifndef SHELL_EXT
 | 
					    uiMsg(UIERROR_INVALIDNAME,FileName,FileName);
 | 
				
			||||||
    Log(FileName,St(MInvalidName),FileName);
 | 
					    return false;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  if (Read(MarkHead.Mark,SIZEOF_MARKHEAD)!=SIZEOF_MARKHEAD)
 | 
					  if (Read(MarkHead.Mark,SIZEOF_MARKHEAD3)!=SIZEOF_MARKHEAD3)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  SFXSize=0;
 | 
					  SFXSize=0;
 | 
				
			||||||
  if (IsSignature(MarkHead.Mark))
 | 
					  
 | 
				
			||||||
 | 
					  RARFORMAT Type;
 | 
				
			||||||
 | 
					  if ((Type=IsSignature(MarkHead.Mark,SIZEOF_MARKHEAD3))!=RARFMT_NONE)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (OldFormat)
 | 
					    Format=Type;
 | 
				
			||||||
      Seek(0,SEEK_SET);
 | 
					    if (Format==RARFMT14)
 | 
				
			||||||
 | 
					      Seek(Tell()-SIZEOF_MARKHEAD3,SEEK_SET);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					@ -135,9 +152,10 @@ bool Archive::IsArchive(bool EnableBroken)
 | 
				
			||||||
    long CurPos=(long)Tell();
 | 
					    long CurPos=(long)Tell();
 | 
				
			||||||
    int ReadSize=Read(&Buffer[0],Buffer.Size()-16);
 | 
					    int ReadSize=Read(&Buffer[0],Buffer.Size()-16);
 | 
				
			||||||
    for (int I=0;I<ReadSize;I++)
 | 
					    for (int I=0;I<ReadSize;I++)
 | 
				
			||||||
      if (Buffer[I]==0x52 && IsSignature((byte *)&Buffer[I]))
 | 
					      if (Buffer[I]==0x52 && (Type=IsSignature((byte *)&Buffer[I],ReadSize-I))!=RARFMT_NONE)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        if (OldFormat && I>0 && CurPos<28 && ReadSize>31)
 | 
					        Format=Type;
 | 
				
			||||||
 | 
					        if (Format==RARFMT14 && I>0 && CurPos<28 && ReadSize>31)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          char *D=&Buffer[28-CurPos];
 | 
					          char *D=&Buffer[28-CurPos];
 | 
				
			||||||
          if (D[0]!=0x52 || D[1]!=0x53 || D[2]!=0x46 || D[3]!=0x58)
 | 
					          if (D[0]!=0x52 || D[1]!=0x53 || D[2]!=0x46 || D[3]!=0x58)
 | 
				
			||||||
| 
						 | 
					@ -145,98 +163,111 @@ bool Archive::IsArchive(bool EnableBroken)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        SFXSize=CurPos+I;
 | 
					        SFXSize=CurPos+I;
 | 
				
			||||||
        Seek(SFXSize,SEEK_SET);
 | 
					        Seek(SFXSize,SEEK_SET);
 | 
				
			||||||
        if (!OldFormat)
 | 
					        if (Format==RARFMT15 || Format==RARFMT50)
 | 
				
			||||||
          Read(MarkHead.Mark,SIZEOF_MARKHEAD);
 | 
					          Read(MarkHead.Mark,SIZEOF_MARKHEAD3);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    if (SFXSize==0)
 | 
					    if (SFXSize==0)
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  ReadHeader();
 | 
					  if (Format==RARFMT_FUTURE)
 | 
				
			||||||
  SeekToNext();
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
  if (OldFormat)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    NewMhd.Flags=OldMhd.Flags & 0x3f;
 | 
					    uiMsg(UIERROR_NEWRARFORMAT,FileName);
 | 
				
			||||||
    NewMhd.HeadSize=OldMhd.HeadSize;
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (Format==RARFMT50) // RAR 5.0 signature is by one byte longer.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (Read(MarkHead.Mark+SIZEOF_MARKHEAD3,1)!=1 || MarkHead.Mark[SIZEOF_MARKHEAD3]!=0)
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    MarkHead.HeadSize=SIZEOF_MARKHEAD5;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
#endif
 | 
					    MarkHead.HeadSize=SIZEOF_MARKHEAD3;
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (HeaderCRC!=NewMhd.HeadCRC)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
#ifndef SHELL_EXT
 | 
					 | 
				
			||||||
      Log(FileName,St(MLogMainHead));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
      Alarm();
 | 
					 | 
				
			||||||
      if (!EnableBroken)
 | 
					 | 
				
			||||||
        return(false);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  Volume=(NewMhd.Flags & MHD_VOLUME);
 | 
					 | 
				
			||||||
  Solid=(NewMhd.Flags & MHD_SOLID)!=0;
 | 
					 | 
				
			||||||
  MainComment=(NewMhd.Flags & MHD_COMMENT)!=0;
 | 
					 | 
				
			||||||
  Locked=(NewMhd.Flags & MHD_LOCK)!=0;
 | 
					 | 
				
			||||||
  Signed=(NewMhd.PosAV!=0);
 | 
					 | 
				
			||||||
  Protected=(NewMhd.Flags & MHD_PROTECT)!=0;
 | 
					 | 
				
			||||||
  Encrypted=(NewMhd.Flags & MHD_PASSWORD)!=0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (NewMhd.EncryptVer>UNP_VER)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
#ifdef RARDLL
 | 
					#ifdef RARDLL
 | 
				
			||||||
    Cmd->DllError=ERAR_UNKNOWN_FORMAT;
 | 
					  // If callback function is not set, we cannot get the password,
 | 
				
			||||||
#else
 | 
					  // so we skip the initial header processing for encrypted header archive.
 | 
				
			||||||
    ErrHandler.SetErrorCode(WARNING);
 | 
					  // It leads to skipped archive comment, but the rest of archive data
 | 
				
			||||||
  #if !defined(SILENT) && !defined(SFX_MODULE)
 | 
					  // is processed correctly.
 | 
				
			||||||
      Log(FileName,St(MUnknownMeth),FileName);
 | 
					  if (Cmd->Callback==NULL)
 | 
				
			||||||
      Log(FileName,St(MVerRequired),NewMhd.EncryptVer/10,NewMhd.EncryptVer%10);
 | 
					    SilentOpen=true;
 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#ifdef RARDLL
 | 
					 | 
				
			||||||
  SilentOpen=true;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //if not encrypted, we'll check it below
 | 
					  bool HeadersLeft; // Any headers left to read.
 | 
				
			||||||
  NotFirstVolume=Encrypted && (NewMhd.Flags & MHD_FIRSTVOLUME)==0;
 | 
					  bool StartFound=false; // Main or encryption headers found.
 | 
				
			||||||
 | 
					  // Skip the archive encryption header if any and read the main header.
 | 
				
			||||||
  if (!SilentOpen || !Encrypted)
 | 
					  while ((HeadersLeft=(ReadHeader()!=0))==true) // Additional parentheses to silence Clang.
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    SaveFilePos SavePos(*this);
 | 
					    SeekToNext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HEADER_TYPE Type=GetHeaderType();
 | 
				
			||||||
 | 
					    // In RAR 5.0 we need to quit after reading HEAD_CRYPT if we wish to
 | 
				
			||||||
 | 
					    // avoid the password prompt.
 | 
				
			||||||
 | 
					    StartFound=Type==HEAD_MAIN || SilentOpen && Type==HEAD_CRYPT;
 | 
				
			||||||
 | 
					    if (StartFound)
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // We should not do it for EnableBroken or we'll get 'not RAR archive'
 | 
				
			||||||
 | 
					  // messages when extracting encrypted archives with wrong password.
 | 
				
			||||||
 | 
					  if (FailedHeaderDecryption && !EnableBroken)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (BrokenHeader || !StartFound) // Main archive header is corrupt or missing.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (!FailedHeaderDecryption) // If not reported a wrong password already.
 | 
				
			||||||
 | 
					      uiMsg(UIERROR_MHEADERBROKEN,FileName);
 | 
				
			||||||
 | 
					    if (!EnableBroken)
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MainComment=MainHead.CommentInHeader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // If we process non-encrypted archive or can request a password,
 | 
				
			||||||
 | 
					  // we set 'first volume' flag based on file attributes below.
 | 
				
			||||||
 | 
					  // It is necessary for RAR 2.x archives, which did not have 'first volume'
 | 
				
			||||||
 | 
					  // flag in main header. Also for all RAR formats we need to scan until
 | 
				
			||||||
 | 
					  // first file header to set "comment" flag when reading service header.
 | 
				
			||||||
 | 
					  // Unless we are in silent mode, we need to know about presence of comment
 | 
				
			||||||
 | 
					  // immediately after IsArchive call.
 | 
				
			||||||
 | 
					  if (HeadersLeft && (!SilentOpen || !Encrypted))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    int64 SavePos=Tell();
 | 
				
			||||||
    int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos;
 | 
					    int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos;
 | 
				
			||||||
 | 
					    HEADER_TYPE SaveCurHeaderType=CurHeaderType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    NotFirstVolume=false;
 | 
					 | 
				
			||||||
    while (ReadHeader()!=0)
 | 
					    while (ReadHeader()!=0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      int HeaderType=GetHeaderType();
 | 
					      HEADER_TYPE HeaderType=GetHeaderType();
 | 
				
			||||||
      if (HeaderType==NEWSUB_HEAD)
 | 
					      if (HeaderType==HEAD_SERVICE)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        if (SubHead.CmpName(SUBHEAD_TYPE_CMT))
 | 
					        // If we have a split service headers, it surely indicates non-first
 | 
				
			||||||
          MainComment=true;
 | 
					        // volume. But not split service header does not guarantee the first
 | 
				
			||||||
        if ((SubHead.Flags & LHD_SPLIT_BEFORE) ||
 | 
					        // volume, because we can have split file after non-split archive
 | 
				
			||||||
            Volume && (NewMhd.Flags & MHD_FIRSTVOLUME)==0)
 | 
					        // comment. So we do not quit from loop here.
 | 
				
			||||||
          NotFirstVolume=true;
 | 
					        FirstVolume=Volume && !SubHead.SplitBefore;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
      {
 | 
					        if (HeaderType==HEAD_FILE)
 | 
				
			||||||
        if (HeaderType==FILE_HEAD && ((NewLhd.Flags & LHD_SPLIT_BEFORE)!=0 ||
 | 
					        {
 | 
				
			||||||
            Volume && NewLhd.UnpVer>=29 && (NewMhd.Flags & MHD_FIRSTVOLUME)==0))
 | 
					          FirstVolume=Volume && !FileHead.SplitBefore;
 | 
				
			||||||
          NotFirstVolume=true;
 | 
					          break;
 | 
				
			||||||
        break;
 | 
					        }
 | 
				
			||||||
      }
 | 
					        else
 | 
				
			||||||
 | 
					          if (HeaderType==HEAD_ENDARC) // Might happen if archive contains only a split service header.
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
      SeekToNext();
 | 
					      SeekToNext();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    CurBlockPos=SaveCurBlockPos;
 | 
					    CurBlockPos=SaveCurBlockPos;
 | 
				
			||||||
    NextBlockPos=SaveNextBlockPos;
 | 
					    NextBlockPos=SaveNextBlockPos;
 | 
				
			||||||
 | 
					    CurHeaderType=SaveCurHeaderType;
 | 
				
			||||||
 | 
					    Seek(SavePos,SEEK_SET);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (!Volume || !NotFirstVolume)
 | 
					  if (!Volume || FirstVolume)
 | 
				
			||||||
  {
 | 
					    wcsncpyz(FirstVolumeName,FileName,ASIZE(FirstVolumeName));
 | 
				
			||||||
    strcpy(FirstVolumeName,FileName);
 | 
					 | 
				
			||||||
    strcpyw(FirstVolumeNameW,FileNameW);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return(true);
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,20 +279,60 @@ void Archive::SeekToNext()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					
 | 
				
			||||||
int Archive::GetRecoverySize(bool Required)
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Calculate the block size including encryption fields and padding if any.
 | 
				
			||||||
 | 
					uint Archive::FullHeaderSize(size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (!Protected)
 | 
					  if (Encrypted)
 | 
				
			||||||
    return(0);
 | 
					  {
 | 
				
			||||||
  if (RecoverySectors!=-1 || !Required)
 | 
					    Size = ALIGN_VALUE(Size, CRYPT_BLOCK_SIZE); // Align to encryption block size.
 | 
				
			||||||
    return(RecoverySectors);
 | 
					    if (Format == RARFMT50)
 | 
				
			||||||
  SaveFilePos SavePos(*this);
 | 
					      Size += SIZE_INITV;
 | 
				
			||||||
  Seek(SFXSize,SEEK_SET);
 | 
					    else
 | 
				
			||||||
  SearchSubBlock(SUBHEAD_TYPE_RR);
 | 
					      Size += SIZE_SALT30;
 | 
				
			||||||
  return(RecoverySectors);
 | 
					  }
 | 
				
			||||||
 | 
					  return uint(Size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef USE_QOPEN
 | 
				
			||||||
 | 
					bool Archive::Open(const wchar *Name,uint Mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // Important if we reuse Archive object and it has virtual QOpen
 | 
				
			||||||
 | 
					  // file position not matching real. For example, for 'l -v volname'.
 | 
				
			||||||
 | 
					  QOpen.Unload();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return File::Open(Name,Mode);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Archive::Read(void *Data,size_t Size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t Result;
 | 
				
			||||||
 | 
					  if (QOpen.Read(Data,Size,Result))
 | 
				
			||||||
 | 
					    return (int)Result;
 | 
				
			||||||
 | 
					  return File::Read(Data,Size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Archive::Seek(int64 Offset,int Method)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!QOpen.Seek(Offset,Method))
 | 
				
			||||||
 | 
					    File::Seek(Offset,Method);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int64 Archive::Tell()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int64 QPos;
 | 
				
			||||||
 | 
					  if (QOpen.Tell(&QPos))
 | 
				
			||||||
 | 
					    return QPos;
 | 
				
			||||||
 | 
					  return File::Tell();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,126 +1,148 @@
 | 
				
			||||||
#ifndef _RAR_ARCHIVE_
 | 
					#ifndef _RAR_ARCHIVE_
 | 
				
			||||||
#define _RAR_ARCHIVE_
 | 
					#define _RAR_ARCHIVE_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Pack;
 | 
					class PPack;
 | 
				
			||||||
 | 
					class RawRead;
 | 
				
			||||||
 | 
					class RawWrite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {EN_LOCK=1,EN_VOL=2,EN_FIRSTVOL=4};
 | 
					enum NOMODIFY_FLAGS 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  NMDF_ALLOWLOCK=1,NMDF_ALLOWANYVOLUME=2,NMDF_ALLOWFIRSTVOLUME=4
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum RARFORMAT {RARFMT_NONE,RARFMT14,RARFMT15,RARFMT50,RARFMT_FUTURE};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ADDSUBDATA_FLAGS
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  ASDF_SPLIT          = 1, // Allow to split archive just before header if necessary.
 | 
				
			||||||
 | 
					  ASDF_COMPRESS       = 2, // Allow to compress data following subheader.
 | 
				
			||||||
 | 
					  ASDF_CRYPT          = 4, // Encrypt data after subheader if password is set.
 | 
				
			||||||
 | 
					  ASDF_CRYPTIFHEADERS = 8  // Encrypt data after subheader only in -hp mode.
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR5 headers must not exceed 2 MB.
 | 
				
			||||||
 | 
					#define MAX_HEADER_SIZE_RAR5 0x200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Archive:public File
 | 
					class Archive:public File
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    bool IsSignature(byte *D);
 | 
					 | 
				
			||||||
    void UpdateLatestTime(FileHeader *CurBlock);
 | 
					    void UpdateLatestTime(FileHeader *CurBlock);
 | 
				
			||||||
    void ConvertNameCase(char *Name);
 | 
					 | 
				
			||||||
    void ConvertNameCase(wchar *Name);
 | 
					    void ConvertNameCase(wchar *Name);
 | 
				
			||||||
    void ConvertUnknownHeader();
 | 
					    void ConvertFileHeader(FileHeader *hd);
 | 
				
			||||||
    size_t ReadOldHeader();
 | 
					    size_t ReadHeader14();
 | 
				
			||||||
 | 
					    size_t ReadHeader15();
 | 
				
			||||||
 | 
					    size_t ReadHeader50();
 | 
				
			||||||
 | 
					    void ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb);
 | 
				
			||||||
 | 
					    void RequestArcPassword();
 | 
				
			||||||
    void UnexpEndArcMsg();
 | 
					    void UnexpEndArcMsg();
 | 
				
			||||||
 | 
					    void BrokenHeaderMsg();
 | 
				
			||||||
 | 
					    void UnkEncVerMsg(const wchar *Name,const wchar *Info);
 | 
				
			||||||
 | 
					    bool DoGetComment(Array<wchar> *CmtData);
 | 
				
			||||||
 | 
					    bool ReadCommentData(Array<wchar> *CmtData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(SHELL_EXT) && !defined(NOCRYPT)
 | 
					#if !defined(RAR_NOCRYPT)
 | 
				
			||||||
    CryptData HeadersCrypt;
 | 
					    CryptData HeadersCrypt;
 | 
				
			||||||
    byte HeadersSalt[SALT_SIZE];
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifndef SHELL_EXT
 | 
					 | 
				
			||||||
    ComprDataIO SubDataIO;
 | 
					    ComprDataIO SubDataIO;
 | 
				
			||||||
    byte SubDataSalt[SALT_SIZE];
 | 
					    bool DummyCmd;
 | 
				
			||||||
#endif
 | 
					    RAROptions *Cmd;
 | 
				
			||||||
    RAROptions *Cmd,DummyCmd;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MarkHeader MarkHead;
 | 
					 | 
				
			||||||
    OldMainHeader OldMhd;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int RecoverySectors;
 | 
					 | 
				
			||||||
    int64 RecoveryPos;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RarTime LatestTime;
 | 
					    RarTime LatestTime;
 | 
				
			||||||
    int LastReadBlock;
 | 
					    int LastReadBlock;
 | 
				
			||||||
    int CurHeaderType;
 | 
					    HEADER_TYPE CurHeaderType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool SilentOpen;
 | 
					    bool SilentOpen;
 | 
				
			||||||
 | 
					#ifdef USE_QOPEN
 | 
				
			||||||
 | 
					    QuickOpen QOpen;
 | 
				
			||||||
 | 
					    bool ProhibitQOpen;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    Archive(RAROptions *InitCmd=NULL);
 | 
					    Archive(RAROptions *InitCmd=NULL);
 | 
				
			||||||
 | 
					    ~Archive();
 | 
				
			||||||
 | 
					    static RARFORMAT IsSignature(const byte *D,size_t Size);
 | 
				
			||||||
    bool IsArchive(bool EnableBroken);
 | 
					    bool IsArchive(bool EnableBroken);
 | 
				
			||||||
    size_t SearchBlock(int BlockType);
 | 
					    size_t SearchBlock(HEADER_TYPE HeaderType);
 | 
				
			||||||
    size_t SearchSubBlock(const char *Type);
 | 
					    size_t SearchSubBlock(const wchar *Type);
 | 
				
			||||||
    int ReadBlock(int BlockType);
 | 
					    size_t SearchRR();
 | 
				
			||||||
    void WriteBlock(int BlockType,BaseBlock *wb=NULL);
 | 
					 | 
				
			||||||
    int PrepareNamesToWrite(char *Name,wchar *NameW,char *DestName,byte *DestNameW);
 | 
					 | 
				
			||||||
    void SetLhdSize();
 | 
					 | 
				
			||||||
    size_t ReadHeader();
 | 
					    size_t ReadHeader();
 | 
				
			||||||
    void CheckArc(bool EnableBroken);
 | 
					    void CheckArc(bool EnableBroken);
 | 
				
			||||||
    void CheckOpen(char *Name,wchar *NameW=NULL);
 | 
					    void CheckOpen(const wchar *Name);
 | 
				
			||||||
    bool WCheckOpen(char *Name,wchar *NameW=NULL);
 | 
					    bool WCheckOpen(const wchar *Name);
 | 
				
			||||||
    bool TestLock(int Mode);
 | 
					    bool GetComment(Array<wchar> *CmtData);
 | 
				
			||||||
    void MakeTemp();
 | 
					 | 
				
			||||||
    void CopyMainHeader(Archive &Src,bool CopySFX=true,char *NameToDisplay=NULL);
 | 
					 | 
				
			||||||
    bool ProcessToFileHead(Archive &Src,bool LastBlockAdded,
 | 
					 | 
				
			||||||
      Pack *Pack=NULL,const char *SkipName=NULL);
 | 
					 | 
				
			||||||
    void TmpToArc(Archive &Src);
 | 
					 | 
				
			||||||
    void CloseNew(int AdjustRecovery,bool CloseVolume);
 | 
					 | 
				
			||||||
    void WriteEndBlock(bool CloseVolume);
 | 
					 | 
				
			||||||
    void CopyFileRecord(Archive &Src);
 | 
					 | 
				
			||||||
    void CopyArchiveData(Archive &Src);
 | 
					 | 
				
			||||||
    bool GetComment(Array<byte> *CmtData,Array<wchar> *CmtDataW);
 | 
					 | 
				
			||||||
    void ViewComment();
 | 
					    void ViewComment();
 | 
				
			||||||
    void ViewFileComment();
 | 
					 | 
				
			||||||
    void SetLatestTime(RarTime *NewTime);
 | 
					    void SetLatestTime(RarTime *NewTime);
 | 
				
			||||||
    void SeekToNext();
 | 
					    void SeekToNext();
 | 
				
			||||||
    bool CheckAccess();
 | 
					    bool CheckAccess();
 | 
				
			||||||
    bool IsArcDir();
 | 
					    bool IsArcDir();
 | 
				
			||||||
    bool IsArcLabel();
 | 
					 | 
				
			||||||
    void ConvertAttributes();
 | 
					    void ConvertAttributes();
 | 
				
			||||||
    int GetRecoverySize(bool Required);
 | 
					 | 
				
			||||||
    void VolSubtractHeaderSize(size_t SubSize);
 | 
					    void VolSubtractHeaderSize(size_t SubSize);
 | 
				
			||||||
    void AddSubData(byte *SrcData,size_t DataSize,File *SrcFile,const char *Name,bool AllowSplit);
 | 
					    uint FullHeaderSize(size_t Size);
 | 
				
			||||||
    bool ReadSubData(Array<byte> *UnpData,File *DestFile);
 | 
					    int64 GetStartPos();
 | 
				
			||||||
    int GetHeaderType() {return(CurHeaderType);};
 | 
					    void AddSubData(byte *SrcData,uint64 DataSize,File *SrcFile,
 | 
				
			||||||
    size_t ReadCommentData(Array<byte> *CmtData,Array<wchar> *CmtDataW);
 | 
					         const wchar *Name,uint Flags);
 | 
				
			||||||
    void WriteCommentData(byte *Data,size_t DataSize,bool FileComment);
 | 
					    bool ReadSubData(Array<byte> *UnpData,File *DestFile,bool TestMode);
 | 
				
			||||||
    RAROptions* GetRAROptions() {return(Cmd);}
 | 
					    HEADER_TYPE GetHeaderType() {return CurHeaderType;}
 | 
				
			||||||
 | 
					    RAROptions* GetRAROptions() {return Cmd;}
 | 
				
			||||||
    void SetSilentOpen(bool Mode) {SilentOpen=Mode;}
 | 
					    void SetSilentOpen(bool Mode) {SilentOpen=Mode;}
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					    void GetRecoveryInfo(bool Required,int64 *Size,int *Percent);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef USE_QOPEN
 | 
				
			||||||
 | 
					    bool Open(const wchar *Name,uint Mode=FMF_READ);
 | 
				
			||||||
 | 
					    int Read(void *Data,size_t Size);
 | 
				
			||||||
 | 
					    void Seek(int64 Offset,int Method);
 | 
				
			||||||
 | 
					    int64 Tell();
 | 
				
			||||||
 | 
					    void QOpenUnload() {QOpen.Unload();}
 | 
				
			||||||
 | 
					    void SetProhibitQOpen(bool Mode) {ProhibitQOpen=Mode;}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    BaseBlock ShortBlock;
 | 
					    BaseBlock ShortBlock;
 | 
				
			||||||
    MainHeader NewMhd;
 | 
					    MarkHeader MarkHead;
 | 
				
			||||||
    FileHeader NewLhd;
 | 
					    MainHeader MainHead;
 | 
				
			||||||
 | 
					    CryptHeader CryptHead;
 | 
				
			||||||
 | 
					    FileHeader FileHead;
 | 
				
			||||||
    EndArcHeader EndArcHead;
 | 
					    EndArcHeader EndArcHead;
 | 
				
			||||||
    SubBlockHeader SubBlockHead;
 | 
					    SubBlockHeader SubBlockHead;
 | 
				
			||||||
    FileHeader SubHead;
 | 
					    FileHeader SubHead;
 | 
				
			||||||
    CommentHeader CommHead;
 | 
					    CommentHeader CommHead;
 | 
				
			||||||
    ProtectHeader ProtectHead;
 | 
					    ProtectHeader ProtectHead;
 | 
				
			||||||
    AVHeader AVHead;
 | 
					 | 
				
			||||||
    SignHeader SignHead;
 | 
					 | 
				
			||||||
    UnixOwnersHeader UOHead;
 | 
					    UnixOwnersHeader UOHead;
 | 
				
			||||||
    MacFInfoHeader MACHead;
 | 
					 | 
				
			||||||
    EAHeader EAHead;
 | 
					    EAHeader EAHead;
 | 
				
			||||||
    StreamHeader StreamHead;
 | 
					    StreamHeader StreamHead;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int64 CurBlockPos;
 | 
					    int64 CurBlockPos;
 | 
				
			||||||
    int64 NextBlockPos;
 | 
					    int64 NextBlockPos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool OldFormat;
 | 
					    RARFORMAT Format;
 | 
				
			||||||
    bool Solid;
 | 
					    bool Solid;
 | 
				
			||||||
    bool Volume;
 | 
					    bool Volume;
 | 
				
			||||||
    bool MainComment;
 | 
					    bool MainComment;
 | 
				
			||||||
    bool Locked;
 | 
					    bool Locked;
 | 
				
			||||||
    bool Signed;
 | 
					    bool Signed;
 | 
				
			||||||
    bool NotFirstVolume;
 | 
					    bool FirstVolume;
 | 
				
			||||||
 | 
					    bool NewNumbering;
 | 
				
			||||||
    bool Protected;
 | 
					    bool Protected;
 | 
				
			||||||
    bool Encrypted;
 | 
					    bool Encrypted;
 | 
				
			||||||
    size_t SFXSize;
 | 
					    size_t SFXSize;
 | 
				
			||||||
    bool BrokenFileHeader;
 | 
					    bool BrokenHeader;
 | 
				
			||||||
 | 
					    bool FailedHeaderDecryption;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(RAR_NOCRYPT)
 | 
				
			||||||
 | 
					    byte ArcSalt[SIZE_SALT50];
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool Splitting;
 | 
					    bool Splitting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ushort HeaderCRC;
 | 
					    uint VolNumber;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    int64 VolWrite;
 | 
					    int64 VolWrite;
 | 
				
			||||||
    int64 AddingFilesSize;
 | 
					    uint64 AddingFilesSize;
 | 
				
			||||||
    size_t AddingHeadersSize;
 | 
					    uint64 AddingHeadersSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool NewArchive;
 | 
					    bool NewArchive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char FirstVolumeName[NM];
 | 
					    wchar FirstVolumeName[NM];
 | 
				
			||||||
    wchar FirstVolumeNameW[NM];
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1671
									
								
								libunrar/arcread.cpp
								
								
								
								
							
							
						
						
									
										1671
									
								
								libunrar/arcread.cpp
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -9,26 +9,39 @@ template <class T> class Array
 | 
				
			||||||
    T *Buffer;
 | 
					    T *Buffer;
 | 
				
			||||||
    size_t BufSize;
 | 
					    size_t BufSize;
 | 
				
			||||||
    size_t AllocSize;
 | 
					    size_t AllocSize;
 | 
				
			||||||
 | 
					    size_t MaxSize;
 | 
				
			||||||
 | 
					    bool Secure; // Clean memory if true.
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    Array();
 | 
					    Array();
 | 
				
			||||||
    Array(size_t Size);
 | 
					    Array(size_t Size);
 | 
				
			||||||
 | 
					    Array(const Array &Src); // Copy constructor.
 | 
				
			||||||
    ~Array();
 | 
					    ~Array();
 | 
				
			||||||
    inline void CleanData();
 | 
					    inline void CleanData();
 | 
				
			||||||
    inline T& operator [](size_t Item);
 | 
					    inline T& operator [](size_t Item) const;
 | 
				
			||||||
    inline size_t Size();
 | 
					    inline T* operator + (size_t Pos);
 | 
				
			||||||
 | 
					    inline size_t Size(); // Returns the size in items, not in bytes.
 | 
				
			||||||
    void Add(size_t Items);
 | 
					    void Add(size_t Items);
 | 
				
			||||||
    void Alloc(size_t Items);
 | 
					    void Alloc(size_t Items);
 | 
				
			||||||
    void Reset();
 | 
					    void Reset();
 | 
				
			||||||
 | 
					    void SoftReset();
 | 
				
			||||||
    void operator = (Array<T> &Src);
 | 
					    void operator = (Array<T> &Src);
 | 
				
			||||||
    void Push(T Item);
 | 
					    void Push(T Item);
 | 
				
			||||||
    T* Addr() {return(Buffer);}
 | 
					    void Append(T *Item,size_t Count);
 | 
				
			||||||
 | 
					    T* Addr(size_t Item) {return Buffer+Item;}
 | 
				
			||||||
 | 
					    void SetMaxSize(size_t Size) {MaxSize=Size;}
 | 
				
			||||||
 | 
					    T* Begin() {return Buffer;}
 | 
				
			||||||
 | 
					    T* End() {return Buffer==NULL ? NULL:Buffer+BufSize;}
 | 
				
			||||||
 | 
					    void SetSecure() {Secure=true;}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class T> void Array<T>::CleanData()
 | 
					template <class T> void Array<T>::CleanData()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Buffer=NULL;
 | 
					  Buffer=NULL;
 | 
				
			||||||
  BufSize=0;
 | 
					  BufSize=0;
 | 
				
			||||||
  AllocSize=0;
 | 
					  AllocSize=0;
 | 
				
			||||||
 | 
					  MaxSize=0;
 | 
				
			||||||
 | 
					  Secure=false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,30 +53,47 @@ template <class T> Array<T>::Array()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class T> Array<T>::Array(size_t Size)
 | 
					template <class T> Array<T>::Array(size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Buffer=(T *)rarmalloc(sizeof(T)*Size);
 | 
					  CleanData();
 | 
				
			||||||
  if (Buffer==NULL && Size!=0)
 | 
					  Add(Size);
 | 
				
			||||||
    ErrHandler.MemoryError();
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AllocSize=BufSize=Size;
 | 
					
 | 
				
			||||||
 | 
					// Copy constructor in case we need to pass an object as value.
 | 
				
			||||||
 | 
					template <class T> Array<T>::Array(const Array &Src)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  CleanData();
 | 
				
			||||||
 | 
					  Alloc(Src.BufSize);
 | 
				
			||||||
 | 
					  if (Src.BufSize!=0)
 | 
				
			||||||
 | 
					    memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class T> Array<T>::~Array()
 | 
					template <class T> Array<T>::~Array()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Buffer!=NULL)
 | 
					  if (Buffer!=NULL)
 | 
				
			||||||
    rarfree(Buffer);
 | 
					  {
 | 
				
			||||||
 | 
					    if (Secure)
 | 
				
			||||||
 | 
					      cleandata(Buffer,AllocSize*sizeof(T));
 | 
				
			||||||
 | 
					    free(Buffer);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class T> inline T& Array<T>::operator [](size_t Item)
 | 
					template <class T> inline T& Array<T>::operator [](size_t Item) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return(Buffer[Item]);
 | 
					  return Buffer[Item];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class T> inline T* Array<T>::operator +(size_t Pos)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return Buffer+Pos;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class T> inline size_t Array<T>::Size()
 | 
					template <class T> inline size_t Array<T>::Size()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return(BufSize);
 | 
					  return BufSize;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,12 +102,35 @@ template <class T> void Array<T>::Add(size_t Items)
 | 
				
			||||||
  BufSize+=Items;
 | 
					  BufSize+=Items;
 | 
				
			||||||
  if (BufSize>AllocSize)
 | 
					  if (BufSize>AllocSize)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    if (MaxSize!=0 && BufSize>MaxSize)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ErrHandler.GeneralErrMsg(L"Maximum allowed array size (%u) is exceeded",MaxSize);
 | 
				
			||||||
 | 
					      ErrHandler.MemoryError();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    size_t Suggested=AllocSize+AllocSize/4+32;
 | 
					    size_t Suggested=AllocSize+AllocSize/4+32;
 | 
				
			||||||
    size_t NewSize=Max(BufSize,Suggested);
 | 
					    size_t NewSize=Max(BufSize,Suggested);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Buffer=(T *)rarrealloc(Buffer,NewSize*sizeof(T));
 | 
					    T *NewBuffer;
 | 
				
			||||||
    if (Buffer==NULL)
 | 
					    if (Secure)
 | 
				
			||||||
      ErrHandler.MemoryError();
 | 
					    {
 | 
				
			||||||
 | 
					      NewBuffer=(T *)malloc(NewSize*sizeof(T));
 | 
				
			||||||
 | 
					      if (NewBuffer==NULL)
 | 
				
			||||||
 | 
					        ErrHandler.MemoryError();
 | 
				
			||||||
 | 
					      if (Buffer!=NULL)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        memcpy(NewBuffer,Buffer,AllocSize*sizeof(T));
 | 
				
			||||||
 | 
					        cleandata(Buffer,AllocSize*sizeof(T));
 | 
				
			||||||
 | 
					        free(Buffer);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      NewBuffer=(T *)realloc(Buffer,NewSize*sizeof(T));
 | 
				
			||||||
 | 
					      if (NewBuffer==NULL)
 | 
				
			||||||
 | 
					        ErrHandler.MemoryError();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Buffer=NewBuffer;
 | 
				
			||||||
    AllocSize=NewSize;
 | 
					    AllocSize=NewSize;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -96,7 +149,7 @@ template <class T> void Array<T>::Reset()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Buffer!=NULL)
 | 
					  if (Buffer!=NULL)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    rarfree(Buffer);
 | 
					    free(Buffer);
 | 
				
			||||||
    Buffer=NULL;
 | 
					    Buffer=NULL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  BufSize=0;
 | 
					  BufSize=0;
 | 
				
			||||||
| 
						 | 
					@ -104,6 +157,14 @@ template <class T> void Array<T>::Reset()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Reset buffer size, but preserve already allocated memory if any,
 | 
				
			||||||
 | 
					// so we can reuse it without wasting time to allocation.
 | 
				
			||||||
 | 
					template <class T> void Array<T>::SoftReset()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  BufSize=0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class T> void Array<T>::operator =(Array<T> &Src)
 | 
					template <class T> void Array<T>::operator =(Array<T> &Src)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Reset();
 | 
					  Reset();
 | 
				
			||||||
| 
						 | 
					@ -119,4 +180,12 @@ template <class T> void Array<T>::Push(T Item)
 | 
				
			||||||
  (*this)[Size()-1]=Item;
 | 
					  (*this)[Size()-1]=Item;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class T> void Array<T>::Append(T *Items,size_t Count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t CurSize=Size();
 | 
				
			||||||
 | 
					  Add(Count);
 | 
				
			||||||
 | 
					  memcpy(Buffer+CurSize,Items,Count*sizeof(T));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,113 +0,0 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ExtractBeEA(Archive &Arc,char *FileName)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (Arc.HeaderCRC!=Arc.EAHead.HeadCRC)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MEABroken),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(CRC_ERROR);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  if (Arc.EAHead.Method<0x31 || Arc.EAHead.Method>0x35 || Arc.EAHead.UnpVer>PACK_VER)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MEAUnknHeader),FileName);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ComprDataIO DataIO;
 | 
					 | 
				
			||||||
  Unpack Unpack(&DataIO);
 | 
					 | 
				
			||||||
  Unpack.Init();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Array<byte> UnpData(Arc.EAHead.UnpSize);
 | 
					 | 
				
			||||||
  DataIO.SetUnpackToMemory(&UnpData[0],Arc.EAHead.UnpSize);
 | 
					 | 
				
			||||||
  DataIO.SetPackedSizeToRead(Arc.EAHead.DataSize);
 | 
					 | 
				
			||||||
  DataIO.EnableShowProgress(false);
 | 
					 | 
				
			||||||
  DataIO.SetFiles(&Arc,NULL);
 | 
					 | 
				
			||||||
  Unpack.SetDestSize(Arc.EAHead.UnpSize);
 | 
					 | 
				
			||||||
  Unpack.DoUnpack(Arc.EAHead.UnpVer,false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Arc.EAHead.EACRC!=~DataIO.UnpFileCRC)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MEABroken),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(CRC_ERROR);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int fd = open(FileName,O_WRONLY);
 | 
					 | 
				
			||||||
  if (fd==-1)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int AttrPos=0;
 | 
					 | 
				
			||||||
  while (AttrPos<Arc.EAHead.UnpSize)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    unsigned char *CurItem=&UnpData[AttrPos];
 | 
					 | 
				
			||||||
    int NameSize=CurItem[0]+((int)CurItem[1]<<8);
 | 
					 | 
				
			||||||
    int Type=CurItem[2]+((int)CurItem[3]<<8)+((int)CurItem[4]<<16)+((int)CurItem[5]<<24);
 | 
					 | 
				
			||||||
    int Size=CurItem[6]+((int)CurItem[7]<<8)+((int)CurItem[8]<<16)+((int)CurItem[9]<<24);
 | 
					 | 
				
			||||||
    char Name[1024];
 | 
					 | 
				
			||||||
    if (NameSize>=sizeof(Name))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
      ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    memcpy(Name,CurItem+10,NameSize);
 | 
					 | 
				
			||||||
    Name[NameSize]=0;
 | 
					 | 
				
			||||||
    if (fs_write_attr(fd,Name,Type,0,CurItem+10+NameSize,Size)==-1)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
      ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    AttrPos+=10+NameSize+Size;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  close(fd);
 | 
					 | 
				
			||||||
  mprintf(St(MShowEA));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ExtractBeEANew(Archive &Arc,char *FileName)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  Array<byte> SubData;
 | 
					 | 
				
			||||||
  if (!Arc.ReadSubData(&SubData,NULL))
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int fd = open(FileName,O_WRONLY);
 | 
					 | 
				
			||||||
  if (fd==-1)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int AttrPos=0;
 | 
					 | 
				
			||||||
  while (AttrPos<Arc.EAHead.UnpSize)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    unsigned char *CurItem=&SubData[AttrPos];
 | 
					 | 
				
			||||||
    int NameSize=CurItem[0]+((int)CurItem[1]<<8);
 | 
					 | 
				
			||||||
    int Type=CurItem[2]+((int)CurItem[3]<<8)+((int)CurItem[4]<<16)+((int)CurItem[5]<<24);
 | 
					 | 
				
			||||||
    int Size=CurItem[6]+((int)CurItem[7]<<8)+((int)CurItem[8]<<16)+((int)CurItem[9]<<24);
 | 
					 | 
				
			||||||
    char Name[1024];
 | 
					 | 
				
			||||||
    if (NameSize>=sizeof(Name))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
      ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    memcpy(Name,CurItem+10,NameSize);
 | 
					 | 
				
			||||||
    Name[NameSize]=0;
 | 
					 | 
				
			||||||
    if (fs_write_attr(fd,Name,Type,0,CurItem+10+NameSize,Size)==-1)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
      ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    AttrPos+=10+NameSize+Size;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  close(fd);
 | 
					 | 
				
			||||||
  mprintf(St(MShowEA));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,183 @@
 | 
				
			||||||
 | 
					// Based on public domain code written in 2012 by Samuel Neves
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef USE_SSE
 | 
				
			||||||
 | 
					#include "blake2s_sse.cpp"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void blake2s_init_param( blake2s_state *S, uint32 node_offset, uint32 node_depth);
 | 
				
			||||||
 | 
					static void blake2s_update( blake2s_state *S, const byte *in, size_t inlen );
 | 
				
			||||||
 | 
					static void blake2s_final( blake2s_state *S, byte *digest );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "blake2sp.cpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint32 blake2s_IV[8] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL,
 | 
				
			||||||
 | 
					  0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const byte blake2s_sigma[10][16] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 } ,
 | 
				
			||||||
 | 
					  { 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 } ,
 | 
				
			||||||
 | 
					  { 11,  8, 12,  0,  5,  2, 15, 13, 10, 14,  3,  6,  7,  1,  9,  4 } ,
 | 
				
			||||||
 | 
					  {  7,  9,  3,  1, 13, 12, 11, 14,  2,  6,  5, 10,  4,  0, 15,  8 } ,
 | 
				
			||||||
 | 
					  {  9,  0,  5,  7,  2,  4, 10, 15, 14,  1, 11, 12,  6,  8,  3, 13 } ,
 | 
				
			||||||
 | 
					  {  2, 12,  6, 10,  0, 11,  8,  3,  4, 13,  7,  5, 15, 14,  1,  9 } ,
 | 
				
			||||||
 | 
					  { 12,  5,  1, 15, 14, 13,  4, 10,  0,  7,  6,  3,  9,  2,  8, 11 } ,
 | 
				
			||||||
 | 
					  { 13, 11,  7, 14, 12,  1,  3,  9,  5,  0, 15,  4,  8,  6,  2, 10 } ,
 | 
				
			||||||
 | 
					  {  6, 15, 14,  9, 11,  3,  0,  8, 12,  2, 13,  7,  1,  4, 10,  5 } ,
 | 
				
			||||||
 | 
					  { 10,  2,  8,  4,  7,  6,  1,  5, 15, 11,  9, 14,  3, 12, 13 , 0 } ,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void blake2s_set_lastnode( blake2s_state *S )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  S->f[1] = ~0U;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Some helper functions, not necessarily useful */
 | 
				
			||||||
 | 
					static inline void blake2s_set_lastblock( blake2s_state *S )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if( S->last_node ) blake2s_set_lastnode( S );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  S->f[0] = ~0U;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void blake2s_increment_counter( blake2s_state *S, const uint32 inc )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  S->t[0] += inc;
 | 
				
			||||||
 | 
					  S->t[1] += ( S->t[0] < inc );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* init2 xors IV with input parameter block */
 | 
				
			||||||
 | 
					void blake2s_init_param( blake2s_state *S, uint32 node_offset, uint32 node_depth)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef USE_SSE
 | 
				
			||||||
 | 
					  if (_SSE_Version>=SSE_SSE2)
 | 
				
			||||||
 | 
					    blake2s_init_sse();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  S->init(); // Clean data.
 | 
				
			||||||
 | 
					  for( int i = 0; i < 8; ++i )
 | 
				
			||||||
 | 
					    S->h[i] = blake2s_IV[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  S->h[0] ^= 0x02080020; // We use BLAKE2sp parameters block.
 | 
				
			||||||
 | 
					  S->h[2] ^= node_offset;
 | 
				
			||||||
 | 
					  S->h[3] ^= (node_depth<<16)|0x20000000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define G(r,i,m,a,b,c,d) \
 | 
				
			||||||
 | 
					  a = a + b + m[blake2s_sigma[r][2*i+0]]; \
 | 
				
			||||||
 | 
					  d = rotr32(d ^ a, 16); \
 | 
				
			||||||
 | 
					  c = c + d; \
 | 
				
			||||||
 | 
					  b = rotr32(b ^ c, 12); \
 | 
				
			||||||
 | 
					  a = a + b + m[blake2s_sigma[r][2*i+1]]; \
 | 
				
			||||||
 | 
					  d = rotr32(d ^ a, 8); \
 | 
				
			||||||
 | 
					  c = c + d; \
 | 
				
			||||||
 | 
					  b = rotr32(b ^ c, 7);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void blake2s_compress( blake2s_state *S, const byte block[BLAKE2S_BLOCKBYTES] )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32 m[16];
 | 
				
			||||||
 | 
					  uint32 v[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for( size_t i = 0; i < 16; ++i )
 | 
				
			||||||
 | 
					    m[i] = RawGet4( block + i * 4 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for( size_t i = 0; i < 8; ++i )
 | 
				
			||||||
 | 
					    v[i] = S->h[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  v[ 8] = blake2s_IV[0];
 | 
				
			||||||
 | 
					  v[ 9] = blake2s_IV[1];
 | 
				
			||||||
 | 
					  v[10] = blake2s_IV[2];
 | 
				
			||||||
 | 
					  v[11] = blake2s_IV[3];
 | 
				
			||||||
 | 
					  v[12] = S->t[0] ^ blake2s_IV[4];
 | 
				
			||||||
 | 
					  v[13] = S->t[1] ^ blake2s_IV[5];
 | 
				
			||||||
 | 
					  v[14] = S->f[0] ^ blake2s_IV[6];
 | 
				
			||||||
 | 
					  v[15] = S->f[1] ^ blake2s_IV[7];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for ( uint r = 0; r <= 9; ++r ) // No gain on i7 if unrolled, but exe size grows.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    G(r,0,m,v[ 0],v[ 4],v[ 8],v[12]);
 | 
				
			||||||
 | 
					    G(r,1,m,v[ 1],v[ 5],v[ 9],v[13]);
 | 
				
			||||||
 | 
					    G(r,2,m,v[ 2],v[ 6],v[10],v[14]);
 | 
				
			||||||
 | 
					    G(r,3,m,v[ 3],v[ 7],v[11],v[15]);
 | 
				
			||||||
 | 
					    G(r,4,m,v[ 0],v[ 5],v[10],v[15]);
 | 
				
			||||||
 | 
					    G(r,5,m,v[ 1],v[ 6],v[11],v[12]);
 | 
				
			||||||
 | 
					    G(r,6,m,v[ 2],v[ 7],v[ 8],v[13]);
 | 
				
			||||||
 | 
					    G(r,7,m,v[ 3],v[ 4],v[ 9],v[14]);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for( size_t i = 0; i < 8; ++i )
 | 
				
			||||||
 | 
					    S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blake2s_update( blake2s_state *S, const byte *in, size_t inlen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  while( inlen > 0 )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    size_t left = S->buflen;
 | 
				
			||||||
 | 
					    size_t fill = 2 * BLAKE2S_BLOCKBYTES - left;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( inlen > fill )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      memcpy( S->buf + left, in, fill ); // Fill buffer
 | 
				
			||||||
 | 
					      S->buflen += fill;
 | 
				
			||||||
 | 
					      blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef USE_SSE
 | 
				
			||||||
 | 
					#ifdef _WIN_32 // We use SSSE3 _mm_shuffle_epi8 only in x64 mode.
 | 
				
			||||||
 | 
					      if (_SSE_Version>=SSE_SSE2)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					      if (_SSE_Version>=SSE_SSSE3)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        blake2s_compress_sse( S, S->buf );
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        blake2s_compress( S, S->buf ); // Compress
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					      blake2s_compress( S, S->buf ); // Compress
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); // Shift buffer left
 | 
				
			||||||
 | 
					      S->buflen -= BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					      in += fill;
 | 
				
			||||||
 | 
					      inlen -= fill;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else // inlen <= fill
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      memcpy( S->buf + left, in, (size_t)inlen );
 | 
				
			||||||
 | 
					      S->buflen += (size_t)inlen; // Be lazy, do not compress
 | 
				
			||||||
 | 
					      in += inlen;
 | 
				
			||||||
 | 
					      inlen = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blake2s_final( blake2s_state *S, byte *digest )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if( S->buflen > BLAKE2S_BLOCKBYTES )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES );
 | 
				
			||||||
 | 
					    blake2s_compress( S, S->buf );
 | 
				
			||||||
 | 
					    S->buflen -= BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					    memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, S->buflen );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blake2s_increment_counter( S, ( uint32 )S->buflen );
 | 
				
			||||||
 | 
					  blake2s_set_lastblock( S );
 | 
				
			||||||
 | 
					  memset( S->buf + S->buflen, 0, 2 * BLAKE2S_BLOCKBYTES - S->buflen ); /* Padding */
 | 
				
			||||||
 | 
					  blake2s_compress( S, S->buf );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for( int i = 0; i < 8; ++i ) /* Output full hash  */
 | 
				
			||||||
 | 
					    RawPut4( S->h[i], digest + 4 * i );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,102 @@
 | 
				
			||||||
 | 
					// Based on public domain code written in 2012 by Samuel Neves
 | 
				
			||||||
 | 
					#ifndef _RAR_BLAKE2_
 | 
				
			||||||
 | 
					#define _RAR_BLAKE2_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BLAKE2_DIGEST_SIZE 32
 | 
				
			||||||
 | 
					#define BLAKE2_THREADS_NUMBER 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum blake2s_constant
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  BLAKE2S_BLOCKBYTES = 64,
 | 
				
			||||||
 | 
					  BLAKE2S_OUTBYTES   = 32
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Alignment to 64 improves performance of both SSE and non-SSE versions.
 | 
				
			||||||
 | 
					// Alignment to n*16 is required for SSE version, so we selected 64.
 | 
				
			||||||
 | 
					// We use the custom alignment scheme instead of __declspec(align(x)),
 | 
				
			||||||
 | 
					// because it is less compiler dependent. Also the compiler directive
 | 
				
			||||||
 | 
					// does not help if structure is a member of class allocated through
 | 
				
			||||||
 | 
					// 'new' operator.
 | 
				
			||||||
 | 
					struct blake2s_state
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  enum { BLAKE_ALIGNMENT = 64 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // buffer and uint32 h[8], t[2], f[2];
 | 
				
			||||||
 | 
					  enum { BLAKE_DATA_SIZE = 48 + 2 * BLAKE2S_BLOCKBYTES };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  byte ubuf[BLAKE_DATA_SIZE + BLAKE_ALIGNMENT];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  byte   *buf;       // byte   buf[2 * BLAKE2S_BLOCKBYTES].
 | 
				
			||||||
 | 
					  uint32 *h, *t, *f; // uint32 h[8], t[2], f[2].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  size_t   buflen;
 | 
				
			||||||
 | 
					  byte  last_node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blake2s_state()
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    set_pointers();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Required when we declare and assign in the same command.
 | 
				
			||||||
 | 
					  blake2s_state(blake2s_state &st)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    set_pointers();
 | 
				
			||||||
 | 
					    *this=st;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void set_pointers()
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Set aligned pointers. Must be done in constructor, not in Init(),
 | 
				
			||||||
 | 
					    // so assignments like 'blake2sp_state res=blake2ctx' work correctly
 | 
				
			||||||
 | 
					    // even if blake2sp_init is not called for 'res'.
 | 
				
			||||||
 | 
					    buf = (byte *) ALIGN_VALUE(ubuf, BLAKE_ALIGNMENT);
 | 
				
			||||||
 | 
					    h   = (uint32 *) (buf + 2 * BLAKE2S_BLOCKBYTES);
 | 
				
			||||||
 | 
					    t   = h + 8;
 | 
				
			||||||
 | 
					    f   = t + 2;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void init()
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    memset( ubuf, 0, sizeof( ubuf ) );
 | 
				
			||||||
 | 
					    buflen = 0;
 | 
				
			||||||
 | 
					    last_node = 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Since we use pointers, the default = would work incorrectly.
 | 
				
			||||||
 | 
					  blake2s_state& operator = (blake2s_state &st)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (this != &st)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      memcpy(buf, st.buf, BLAKE_DATA_SIZE);
 | 
				
			||||||
 | 
					      buflen = st.buflen;
 | 
				
			||||||
 | 
					      last_node = st.last_node;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return *this;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					class ThreadPool;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct blake2sp_state
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  blake2s_state S[8];
 | 
				
			||||||
 | 
					  blake2s_state R;
 | 
				
			||||||
 | 
					  byte buf[8 * BLAKE2S_BLOCKBYTES];
 | 
				
			||||||
 | 
					  size_t buflen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					  ThreadPool *ThPool;
 | 
				
			||||||
 | 
					  uint MaxThreads;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blake2sp_init( blake2sp_state *S );
 | 
				
			||||||
 | 
					void blake2sp_update( blake2sp_state *S, const byte *in, size_t inlen );
 | 
				
			||||||
 | 
					void blake2sp_final( blake2sp_state *S, byte *digest );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,129 @@
 | 
				
			||||||
 | 
					// Based on public domain code written in 2012 by Samuel Neves
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const byte blake2s_sigma[10][16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Initialization vector.
 | 
				
			||||||
 | 
					static __m128i blake2s_IV_0_3, blake2s_IV_4_7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_64
 | 
				
			||||||
 | 
					// Constants for cyclic rotation. Used in 64-bit mode in mm_rotr_epi32 macro.
 | 
				
			||||||
 | 
					static __m128i crotr8, crotr16;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void blake2s_init_sse()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // We cannot initialize these 128 bit variables in place when declaring
 | 
				
			||||||
 | 
					  // them globally, because global scope initialization is performed before
 | 
				
			||||||
 | 
					  // our SSE check and it would make code incompatible with older non-SSE2
 | 
				
			||||||
 | 
					  // CPUs. Also we cannot initialize them as static inside of function
 | 
				
			||||||
 | 
					  // using these variables, because SSE static initialization is not thread
 | 
				
			||||||
 | 
					  // safe: first thread starts initialization and sets "init done" flag even
 | 
				
			||||||
 | 
					  // if it is not done yet, second thread can attempt to access half-init
 | 
				
			||||||
 | 
					  // SSE data. So we moved init code here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blake2s_IV_0_3 = _mm_setr_epi32( 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A );
 | 
				
			||||||
 | 
					  blake2s_IV_4_7 = _mm_setr_epi32( 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_64
 | 
				
			||||||
 | 
					  crotr8 = _mm_set_epi8( 12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1 );
 | 
				
			||||||
 | 
					  crotr16 = _mm_set_epi8( 13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2 );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LOAD(p)  _mm_load_si128( (__m128i *)(p) )
 | 
				
			||||||
 | 
					#define STORE(p,r) _mm_store_si128((__m128i *)(p), r)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_32
 | 
				
			||||||
 | 
					// 32-bit mode has less SSE2 registers and in MSVC2008 it is more efficient
 | 
				
			||||||
 | 
					// to not use _mm_shuffle_epi8 here.
 | 
				
			||||||
 | 
					#define mm_rotr_epi32(r, c) ( \
 | 
				
			||||||
 | 
					              _mm_xor_si128(_mm_srli_epi32( (r), c ),_mm_slli_epi32( (r), 32-c )) )
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define mm_rotr_epi32(r, c) ( \
 | 
				
			||||||
 | 
					                c==8 ? _mm_shuffle_epi8(r,crotr8) \
 | 
				
			||||||
 | 
					              : c==16 ? _mm_shuffle_epi8(r,crotr16) \
 | 
				
			||||||
 | 
					              : _mm_xor_si128(_mm_srli_epi32( (r), c ),_mm_slli_epi32( (r), 32-c )) )
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define G1(row1,row2,row3,row4,buf) \
 | 
				
			||||||
 | 
					  row1 = _mm_add_epi32( _mm_add_epi32( row1, buf), row2 ); \
 | 
				
			||||||
 | 
					  row4 = _mm_xor_si128( row4, row1 ); \
 | 
				
			||||||
 | 
					  row4 =  mm_rotr_epi32(row4, 16); \
 | 
				
			||||||
 | 
					  row3 = _mm_add_epi32( row3, row4 );   \
 | 
				
			||||||
 | 
					  row2 = _mm_xor_si128( row2, row3 ); \
 | 
				
			||||||
 | 
					  row2 =  mm_rotr_epi32(row2, 12);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define G2(row1,row2,row3,row4,buf) \
 | 
				
			||||||
 | 
					  row1 = _mm_add_epi32( _mm_add_epi32( row1, buf), row2 ); \
 | 
				
			||||||
 | 
					  row4 = _mm_xor_si128( row4, row1 ); \
 | 
				
			||||||
 | 
					  row4 =  mm_rotr_epi32(row4, 8); \
 | 
				
			||||||
 | 
					  row3 = _mm_add_epi32( row3, row4 );   \
 | 
				
			||||||
 | 
					  row2 = _mm_xor_si128( row2, row3 ); \
 | 
				
			||||||
 | 
					  row2 =  mm_rotr_epi32(row2, 7);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DIAGONALIZE(row1,row2,row3,row4) \
 | 
				
			||||||
 | 
					  row4 = _mm_shuffle_epi32( row4, _MM_SHUFFLE(2,1,0,3) ); \
 | 
				
			||||||
 | 
					  row3 = _mm_shuffle_epi32( row3, _MM_SHUFFLE(1,0,3,2) ); \
 | 
				
			||||||
 | 
					  row2 = _mm_shuffle_epi32( row2, _MM_SHUFFLE(0,3,2,1) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UNDIAGONALIZE(row1,row2,row3,row4) \
 | 
				
			||||||
 | 
					  row4 = _mm_shuffle_epi32( row4, _MM_SHUFFLE(0,3,2,1) ); \
 | 
				
			||||||
 | 
					  row3 = _mm_shuffle_epi32( row3, _MM_SHUFFLE(1,0,3,2) ); \
 | 
				
			||||||
 | 
					  row2 = _mm_shuffle_epi32( row2, _MM_SHUFFLE(2,1,0,3) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_64
 | 
				
			||||||
 | 
					  // MSVC 2008 in x64 mode expands _mm_set_epi32 to store to stack and load
 | 
				
			||||||
 | 
					  // from stack operations, which are slower than this code.
 | 
				
			||||||
 | 
					  #define _mm_set_epi32(i3,i2,i1,i0) \
 | 
				
			||||||
 | 
					    _mm_unpacklo_epi32(_mm_unpacklo_epi32(_mm_cvtsi32_si128(i0),_mm_cvtsi32_si128(i2)), \
 | 
				
			||||||
 | 
					                       _mm_unpacklo_epi32(_mm_cvtsi32_si128(i1),_mm_cvtsi32_si128(i3)))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Original BLAKE2 SSE4.1 message loading code was a little slower in x86 mode
 | 
				
			||||||
 | 
					// and about the same in x64 mode in our test. Perhaps depends on compiler.
 | 
				
			||||||
 | 
					// We also tried _mm_i32gather_epi32 and _mm256_i32gather_epi32 AVX2 gather
 | 
				
			||||||
 | 
					// instructions here, but they did not show any speed gain on i7-6700K.
 | 
				
			||||||
 | 
					#define SSE_ROUND(m,row,r) \
 | 
				
			||||||
 | 
					{ \
 | 
				
			||||||
 | 
					  __m128i buf; \
 | 
				
			||||||
 | 
					  buf=_mm_set_epi32(m[blake2s_sigma[r][6]],m[blake2s_sigma[r][4]],m[blake2s_sigma[r][2]],m[blake2s_sigma[r][0]]); \
 | 
				
			||||||
 | 
					  G1(row[0],row[1],row[2],row[3],buf); \
 | 
				
			||||||
 | 
					  buf=_mm_set_epi32(m[blake2s_sigma[r][7]],m[blake2s_sigma[r][5]],m[blake2s_sigma[r][3]],m[blake2s_sigma[r][1]]); \
 | 
				
			||||||
 | 
					  G2(row[0],row[1],row[2],row[3],buf); \
 | 
				
			||||||
 | 
					  DIAGONALIZE(row[0],row[1],row[2],row[3]); \
 | 
				
			||||||
 | 
					  buf=_mm_set_epi32(m[blake2s_sigma[r][14]],m[blake2s_sigma[r][12]],m[blake2s_sigma[r][10]],m[blake2s_sigma[r][8]]); \
 | 
				
			||||||
 | 
					  G1(row[0],row[1],row[2],row[3],buf); \
 | 
				
			||||||
 | 
					  buf=_mm_set_epi32(m[blake2s_sigma[r][15]],m[blake2s_sigma[r][13]],m[blake2s_sigma[r][11]],m[blake2s_sigma[r][9]]); \
 | 
				
			||||||
 | 
					  G2(row[0],row[1],row[2],row[3],buf); \
 | 
				
			||||||
 | 
					  UNDIAGONALIZE(row[0],row[1],row[2],row[3]); \
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int blake2s_compress_sse( blake2s_state *S, const byte block[BLAKE2S_BLOCKBYTES] )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  __m128i row[4];
 | 
				
			||||||
 | 
					  __m128i ff0, ff1;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  const uint32  *m = ( uint32 * )block;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  row[0] = ff0 = LOAD( &S->h[0] );
 | 
				
			||||||
 | 
					  row[1] = ff1 = LOAD( &S->h[4] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  row[2] = blake2s_IV_0_3;
 | 
				
			||||||
 | 
					  row[3] = _mm_xor_si128( blake2s_IV_4_7, LOAD( &S->t[0] ) );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 0 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 1 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 2 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 3 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 4 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 5 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 6 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 7 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 8 );
 | 
				
			||||||
 | 
					  SSE_ROUND( m, row, 9 );
 | 
				
			||||||
 | 
					  STORE( &S->h[0], _mm_xor_si128( ff0, _mm_xor_si128( row[0], row[2] ) ) );
 | 
				
			||||||
 | 
					  STORE( &S->h[4], _mm_xor_si128( ff1, _mm_xor_si128( row[1], row[3] ) ) );
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,153 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   BLAKE2 reference source code package - reference C implementations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   To the extent possible under law, the author(s) have dedicated all copyright
 | 
				
			||||||
 | 
					   and related and neighboring rights to this software to the public domain
 | 
				
			||||||
 | 
					   worldwide. This software is distributed without any warranty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   You should have received a copy of the CC0 Public Domain Dedication along with
 | 
				
			||||||
 | 
					   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PARALLELISM_DEGREE 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blake2sp_init( blake2sp_state *S )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  memset( S->buf, 0, sizeof( S->buf ) );
 | 
				
			||||||
 | 
					  S->buflen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blake2s_init_param( &S->R, 0, 1 ); // Init root.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for( uint i = 0; i < PARALLELISM_DEGREE; ++i )
 | 
				
			||||||
 | 
					    blake2s_init_param( &S->S[i], i, 0 ); // Init leaf.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  S->R.last_node = 1;
 | 
				
			||||||
 | 
					  S->S[PARALLELISM_DEGREE - 1].last_node = 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Blake2ThreadData
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  void Update();
 | 
				
			||||||
 | 
					  blake2s_state *S;
 | 
				
			||||||
 | 
					  const byte *in;
 | 
				
			||||||
 | 
					  size_t inlen;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Blake2ThreadData::Update()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t inlen__ = inlen;
 | 
				
			||||||
 | 
					  const byte *in__ = ( const byte * )in;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					#ifdef USE_SSE
 | 
				
			||||||
 | 
					    // We gain 5% in i7 SSE mode by prefetching next data block.
 | 
				
			||||||
 | 
					    if (_SSE_Version>=SSE_SSE && inlen__ >= 2 * PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES)
 | 
				
			||||||
 | 
					      _mm_prefetch((char*)(in__ +  PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES), _MM_HINT_T0);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    blake2s_update( S, in__, BLAKE2S_BLOCKBYTES );
 | 
				
			||||||
 | 
					    in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					    inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					THREAD_PROC(Blake2Thread)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  Blake2ThreadData *td=(Blake2ThreadData *)Data;
 | 
				
			||||||
 | 
					  td->Update();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blake2sp_update( blake2sp_state *S, const byte *in, size_t inlen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t left = S->buflen;
 | 
				
			||||||
 | 
					  size_t fill = sizeof( S->buf ) - left;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( left && inlen >= fill )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    memcpy( S->buf + left, in, fill );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for( size_t i = 0; i < PARALLELISM_DEGREE; ++i )
 | 
				
			||||||
 | 
					      blake2s_update( &S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    in += fill;
 | 
				
			||||||
 | 
					    inlen -= fill;
 | 
				
			||||||
 | 
					    left = 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Blake2ThreadData btd_array[PARALLELISM_DEGREE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					  uint ThreadNumber = inlen < 0x1000 ? 1 : S->MaxThreads;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  if (ThreadNumber==6 || ThreadNumber==7) // 6 and 7 threads work slower than 4 here.
 | 
				
			||||||
 | 
					    ThreadNumber=4;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  uint ThreadNumber=1;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (size_t id__=0;id__<PARALLELISM_DEGREE;)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    for (uint Thread=0;Thread<ThreadNumber && id__<PARALLELISM_DEGREE;Thread++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      Blake2ThreadData *btd=btd_array+Thread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      btd->inlen = inlen;
 | 
				
			||||||
 | 
					      btd->in = in + id__ * BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					      btd->S = &S->S[id__];
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					      if (ThreadNumber>1)
 | 
				
			||||||
 | 
					        S->ThPool->AddTask(Blake2Thread,(void*)btd);
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        btd->Update();
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					      btd->Update();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      id__++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					    if (S->ThPool!=NULL) // Can be NULL in -mt1 mode.
 | 
				
			||||||
 | 
					      S->ThPool->WaitDone();
 | 
				
			||||||
 | 
					#endif // RAR_SMP
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES );
 | 
				
			||||||
 | 
					  inlen %= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( inlen > 0 )
 | 
				
			||||||
 | 
					    memcpy( S->buf + left, in, (size_t)inlen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  S->buflen = left + (size_t)inlen;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blake2sp_final( blake2sp_state *S, byte *digest )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  byte hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for( size_t i = 0; i < PARALLELISM_DEGREE; ++i )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if( S->buflen > i * BLAKE2S_BLOCKBYTES )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      size_t left = S->buflen - i * BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if( left > BLAKE2S_BLOCKBYTES ) left = BLAKE2S_BLOCKBYTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      blake2s_update( &S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, left );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    blake2s_final( &S->S[i], hash[i] );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for( size_t i = 0; i < PARALLELISM_DEGREE; ++i )
 | 
				
			||||||
 | 
					    blake2s_update( &S->R, hash[i], BLAKE2S_OUTBYTES );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blake2s_final( &S->R, digest );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1578
									
								
								libunrar/cmddata.cpp
								
								
								
								
							
							
						
						
									
										1578
									
								
								libunrar/cmddata.cpp
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -1,57 +1,70 @@
 | 
				
			||||||
#ifndef _RAR_CMDDATA_
 | 
					#ifndef _RAR_CMDDATA_
 | 
				
			||||||
#define _RAR_CMDDATA_
 | 
					#define _RAR_CMDDATA_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DefaultStoreList "7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lzh;mp3;rar;taz;tgz;z;zip"
 | 
					
 | 
				
			||||||
 | 
					#define DefaultStoreList L"7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lz;lzh;mp3;rar;taz;tgz;xz;z;zip;zipx"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum RAR_CMD_LIST_MODE {RCLM_AUTO,RCLM_REJECT_LISTS,RCLM_ACCEPT_LISTS};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum IS_PROCESS_FILE_FLAGS {IPFF_EXCLUDE_PARENT=1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CommandData:public RAROptions
 | 
					class CommandData:public RAROptions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    void ProcessSwitchesString(char *Str);
 | 
					    void ProcessSwitchesString(const wchar *Str);
 | 
				
			||||||
    void ProcessSwitch(char *Switch,wchar *SwitchW=NULL);
 | 
					    void ProcessSwitch(const wchar *Switch);
 | 
				
			||||||
    void BadSwitch(char *Switch);
 | 
					    void BadSwitch(const wchar *Switch);
 | 
				
			||||||
    bool ExclCheckArgs(StringList *Args,char *CheckName,bool CheckFullPath,int MatchMode);
 | 
					    uint GetExclAttr(const wchar *Str,bool &Dir);
 | 
				
			||||||
    uint GetExclAttr(char *Str);
 | 
					#if !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					    void SetTimeFilters(const wchar *Mod,bool Before,bool Age);
 | 
				
			||||||
 | 
					    void SetStoreTimeMode(const wchar *S);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool FileLists;
 | 
					    bool FileLists;
 | 
				
			||||||
    bool NoMoreSwitches;
 | 
					    bool NoMoreSwitches;
 | 
				
			||||||
 | 
					    RAR_CMD_LIST_MODE ListMode;
 | 
				
			||||||
    bool BareOutput;
 | 
					    bool BareOutput;
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    CommandData();
 | 
					    CommandData();
 | 
				
			||||||
    ~CommandData();
 | 
					 | 
				
			||||||
    void Init();
 | 
					    void Init();
 | 
				
			||||||
    void Close();
 | 
					
 | 
				
			||||||
    void ParseArg(char *Arg,wchar *ArgW);
 | 
					    void ParseCommandLine(bool Preprocess,int argc, char *argv[]);
 | 
				
			||||||
 | 
					    void ParseArg(wchar *ArgW);
 | 
				
			||||||
    void ParseDone();
 | 
					    void ParseDone();
 | 
				
			||||||
    void ParseEnvVar();
 | 
					    void ParseEnvVar();
 | 
				
			||||||
    void ReadConfig(int argc,char *argv[]);
 | 
					    void ReadConfig();
 | 
				
			||||||
    bool IsConfigEnabled(int argc,char *argv[]);
 | 
					    void PreprocessArg(const wchar *Arg);
 | 
				
			||||||
    void OutTitle();
 | 
					    void OutTitle();
 | 
				
			||||||
    void OutHelp();
 | 
					    void OutHelp(RAR_EXIT ExitCode);
 | 
				
			||||||
    bool IsSwitch(int Ch);
 | 
					    bool IsSwitch(int Ch);
 | 
				
			||||||
    bool ExclCheck(char *CheckName,bool CheckFullPath,bool CheckInclList);
 | 
					    bool ExclCheck(const wchar *CheckName,bool Dir,bool CheckFullPath,bool CheckInclList);
 | 
				
			||||||
    bool StoreCheck(char *CheckName);
 | 
					    static bool CheckArgs(StringList *Args,bool Dir,const wchar *CheckName,bool CheckFullPath,int MatchMode);
 | 
				
			||||||
    bool TimeCheck(RarTime &ft);
 | 
					    bool ExclDirByAttr(uint FileAttr);
 | 
				
			||||||
 | 
					    bool TimeCheck(RarTime &ftm,RarTime &ftc,RarTime &fta);
 | 
				
			||||||
    bool SizeCheck(int64 Size);
 | 
					    bool SizeCheck(int64 Size);
 | 
				
			||||||
    bool AnyFiltersActive();
 | 
					    bool AnyFiltersActive();
 | 
				
			||||||
    int IsProcessFile(FileHeader &NewLhd,bool *ExactMatch=NULL,int MatchType=MATCH_WILDSUBPATH);
 | 
					    int IsProcessFile(FileHeader &FileHead,bool *ExactMatch,int MatchType,
 | 
				
			||||||
 | 
					                      bool Flags,wchar *MatchedArg,uint MatchedArgSize);
 | 
				
			||||||
    void ProcessCommand();
 | 
					    void ProcessCommand();
 | 
				
			||||||
    void AddArcName(char *Name,wchar *NameW);
 | 
					    void AddArcName(const wchar *Name);
 | 
				
			||||||
    bool GetArcName(char *Name,wchar *NameW,int MaxSize);
 | 
					    bool GetArcName(wchar *Name,int MaxSize);
 | 
				
			||||||
    bool CheckWinSize();
 | 
					    bool CheckWinSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int GetRecoverySize(char *Str,int DefSize);
 | 
					    int GetRecoverySize(const wchar *Str,int DefSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char Command[NM+16];
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
    wchar CommandW[NM+16];
 | 
					    void ReportWrongSwitches(RARFORMAT Format);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char ArcName[NM];
 | 
					    wchar Command[NM+16];
 | 
				
			||||||
    wchar ArcNameW[NM];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    StringList *FileArgs;
 | 
					    wchar ArcName[NM];
 | 
				
			||||||
    StringList *ExclArgs;
 | 
					
 | 
				
			||||||
    StringList *InclArgs;
 | 
					    StringList FileArgs;
 | 
				
			||||||
    StringList *ArcNames;
 | 
					    StringList ExclArgs;
 | 
				
			||||||
    StringList *StoreArgs;
 | 
					    StringList InclArgs;
 | 
				
			||||||
 | 
					    StringList ArcNames;
 | 
				
			||||||
 | 
					    StringList StoreArgs;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,352 @@
 | 
				
			||||||
 | 
					// Return 'true' if we need to exclude the file from processing as result
 | 
				
			||||||
 | 
					// of -x switch. If CheckInclList is true, we also check the file against
 | 
				
			||||||
 | 
					// the include list created with -n switch.
 | 
				
			||||||
 | 
					bool CommandData::ExclCheck(const wchar *CheckName,bool Dir,bool CheckFullPath,bool CheckInclList)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (CheckArgs(&ExclArgs,Dir,CheckName,CheckFullPath,MATCH_WILDSUBPATH))
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  if (!CheckInclList || InclArgs.ItemsCount()==0)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  if (CheckArgs(&InclArgs,Dir,CheckName,CheckFullPath,MATCH_WILDSUBPATH))
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandData::CheckArgs(StringList *Args,bool Dir,const wchar *CheckName,bool CheckFullPath,int MatchMode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wchar *Name=ConvertPath(CheckName,NULL,0);
 | 
				
			||||||
 | 
					  wchar FullName[NM];
 | 
				
			||||||
 | 
					  wchar CurMask[NM];
 | 
				
			||||||
 | 
					  *FullName=0;
 | 
				
			||||||
 | 
					  Args->Rewind();
 | 
				
			||||||
 | 
					  while (Args->GetString(CurMask,ASIZE(CurMask)))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wchar *LastMaskChar=PointToLastChar(CurMask);
 | 
				
			||||||
 | 
					    bool DirMask=IsPathDiv(*LastMaskChar); // Mask for directories only.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Dir)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // CheckName is a directory.
 | 
				
			||||||
 | 
					      if (DirMask)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // We process the directory and have the directory exclusion mask.
 | 
				
			||||||
 | 
					        // So let's convert "mask\" to "mask" and process it normally.
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        *LastMaskChar=0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // REMOVED, we want -npath\* to match empty folders too.
 | 
				
			||||||
 | 
					        // If mask has wildcards in name part and does not have the trailing
 | 
				
			||||||
 | 
					        // '\' character, we cannot use it for directories.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					        // if (IsWildcard(PointToName(CurMask)))
 | 
				
			||||||
 | 
					        //  continue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // If we process a file inside of directory excluded by "dirmask\".
 | 
				
			||||||
 | 
					      // we want to exclude such file too. So we convert "dirmask\" to
 | 
				
			||||||
 | 
					      // "dirmask\*". It is important for operations other than archiving
 | 
				
			||||||
 | 
					      // with -x. When archiving with -x, directory matched by "dirmask\"
 | 
				
			||||||
 | 
					      // is excluded from further scanning.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (DirMask)
 | 
				
			||||||
 | 
					        wcsncatz(CurMask,L"*",ASIZE(CurMask));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					    if (CheckFullPath && IsFullPath(CurMask))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // We do not need to do the special "*\" processing here, because
 | 
				
			||||||
 | 
					      // unlike the "else" part of this "if", now we convert names to full
 | 
				
			||||||
 | 
					      // format, so they all include the path, which is matched by "*\"
 | 
				
			||||||
 | 
					      // correctly. Moreover, removing "*\" from mask would break
 | 
				
			||||||
 | 
					      // the comparison, because now all names have the path.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (*FullName==0)
 | 
				
			||||||
 | 
					        ConvertNameToFull(CheckName,FullName,ASIZE(FullName));
 | 
				
			||||||
 | 
					      if (CmpName(CurMask,FullName,MatchMode))
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wchar NewName[NM+2],*CurName=Name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Important to convert before "*\" check below, so masks like
 | 
				
			||||||
 | 
					      // d:*\something are processed properly.
 | 
				
			||||||
 | 
					      wchar *CmpMask=ConvertPath(CurMask,NULL,0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (CmpMask[0]=='*' && IsPathDiv(CmpMask[1]))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // We want "*\name" to match 'name' not only in subdirectories,
 | 
				
			||||||
 | 
					        // but also in the current directory. We convert the name
 | 
				
			||||||
 | 
					        // from 'name' to '.\name' to be matched by "*\" part even if it is
 | 
				
			||||||
 | 
					        // in current directory.
 | 
				
			||||||
 | 
					        NewName[0]='.';
 | 
				
			||||||
 | 
					        NewName[1]=CPATHDIVIDER;
 | 
				
			||||||
 | 
					        wcsncpyz(NewName+2,Name,ASIZE(NewName)-2);
 | 
				
			||||||
 | 
					        CurName=NewName;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (CmpName(CmpMask,CurName,MatchMode))
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					// Now this function performs only one task and only in Windows version:
 | 
				
			||||||
 | 
					// it skips symlinks to directories if -e1024 switch is specified.
 | 
				
			||||||
 | 
					// Symlinks are skipped in ScanTree class, so their entire contents
 | 
				
			||||||
 | 
					// is skipped too. Without this function we would check the attribute
 | 
				
			||||||
 | 
					// only directly before archiving, so we would skip the symlink record,
 | 
				
			||||||
 | 
					// but not the contents of symlinked directory.
 | 
				
			||||||
 | 
					bool CommandData::ExclDirByAttr(uint FileAttr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  if ((FileAttr & FILE_ATTRIBUTE_REPARSE_POINT)!=0 &&
 | 
				
			||||||
 | 
					      (ExclFileAttr & FILE_ATTRIBUTE_REPARSE_POINT)!=0)
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					void CommandData::SetTimeFilters(const wchar *Mod,bool Before,bool Age)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  bool ModeOR=false,TimeMods=false;
 | 
				
			||||||
 | 
					  const wchar *S=Mod;
 | 
				
			||||||
 | 
					  // Check if any 'mca' modifiers are present, set OR mode if 'o' is present,
 | 
				
			||||||
 | 
					  // skip modifiers and set S to beginning of time string. Be sure to check
 | 
				
			||||||
 | 
					  // *S!=0, because termination 0 is a part of string for wcschr.
 | 
				
			||||||
 | 
					  for (;*S!=0 && wcschr(L"MCAOmcao",*S)!=NULL;S++)
 | 
				
			||||||
 | 
					    if (*S=='o' || *S=='O')
 | 
				
			||||||
 | 
					      ModeOR=true;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      TimeMods=true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!TimeMods) // Assume 'm' if no modifiers are specified.
 | 
				
			||||||
 | 
					    Mod=L"m";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set the specified time for every modifier. Be sure to check *Mod!=0,
 | 
				
			||||||
 | 
					  // because termination 0 is a part of string for wcschr. This check is
 | 
				
			||||||
 | 
					  // important when we set Mod to "m" above.
 | 
				
			||||||
 | 
					  for (;*Mod!=0 && wcschr(L"MCAOmcao",*Mod)!=NULL;Mod++)
 | 
				
			||||||
 | 
					    switch(toupperw(*Mod))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case 'M': 
 | 
				
			||||||
 | 
					        if (Before)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Age ? FileMtimeBefore.SetAgeText(S):FileMtimeBefore.SetIsoText(S);
 | 
				
			||||||
 | 
					          FileMtimeBeforeOR=ModeOR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Age ? FileMtimeAfter.SetAgeText(S):FileMtimeAfter.SetIsoText(S);
 | 
				
			||||||
 | 
					          FileMtimeAfterOR=ModeOR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'C':
 | 
				
			||||||
 | 
					        if (Before)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Age ? FileCtimeBefore.SetAgeText(S):FileCtimeBefore.SetIsoText(S);
 | 
				
			||||||
 | 
					          FileCtimeBeforeOR=ModeOR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Age ? FileCtimeAfter.SetAgeText(S):FileCtimeAfter.SetIsoText(S);
 | 
				
			||||||
 | 
					          FileCtimeAfterOR=ModeOR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'A':
 | 
				
			||||||
 | 
					        if (Before)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Age ? FileAtimeBefore.SetAgeText(S):FileAtimeBefore.SetIsoText(S);
 | 
				
			||||||
 | 
					          FileAtimeBeforeOR=ModeOR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Age ? FileAtimeAfter.SetAgeText(S):FileAtimeAfter.SetIsoText(S);
 | 
				
			||||||
 | 
					          FileAtimeAfterOR=ModeOR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					// Return 'true' if we need to exclude the file from processing.
 | 
				
			||||||
 | 
					bool CommandData::TimeCheck(RarTime &ftm,RarTime &ftc,RarTime &fta)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  bool FilterOR=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (FileMtimeBefore.IsSet()) // Filter present.
 | 
				
			||||||
 | 
					    if (ftm>=FileMtimeBefore) // Condition not matched.
 | 
				
			||||||
 | 
					      if (FileMtimeBeforeOR) 
 | 
				
			||||||
 | 
					        FilterOR=true; // Not matched OR filter is present.
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return true; // Exclude file in AND mode.
 | 
				
			||||||
 | 
					    else  // Condition matched.
 | 
				
			||||||
 | 
					      if (FileMtimeBeforeOR) 
 | 
				
			||||||
 | 
					        return false; // Include file in OR mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (FileMtimeAfter.IsSet()) // Filter present.
 | 
				
			||||||
 | 
					    if (ftm<FileMtimeAfter) // Condition not matched.
 | 
				
			||||||
 | 
					      if (FileMtimeAfterOR) 
 | 
				
			||||||
 | 
					        FilterOR=true; // Not matched OR filter is present.
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return true; // Exclude file in AND mode.
 | 
				
			||||||
 | 
					    else  // Condition matched.
 | 
				
			||||||
 | 
					      if (FileMtimeAfterOR) 
 | 
				
			||||||
 | 
					        return false; // Include file in OR mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (FileCtimeBefore.IsSet()) // Filter present.
 | 
				
			||||||
 | 
					    if (ftc>=FileCtimeBefore) // Condition not matched.
 | 
				
			||||||
 | 
					      if (FileCtimeBeforeOR) 
 | 
				
			||||||
 | 
					        FilterOR=true; // Not matched OR filter is present.
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return true; // Exclude file in AND mode.
 | 
				
			||||||
 | 
					    else  // Condition matched.
 | 
				
			||||||
 | 
					      if (FileCtimeBeforeOR) 
 | 
				
			||||||
 | 
					        return false; // Include file in OR mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (FileCtimeAfter.IsSet()) // Filter present.
 | 
				
			||||||
 | 
					    if (ftc<FileCtimeAfter) // Condition not matched.
 | 
				
			||||||
 | 
					      if (FileCtimeAfterOR) 
 | 
				
			||||||
 | 
					        FilterOR=true; // Not matched OR filter is present.
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return true; // Exclude file in AND mode.
 | 
				
			||||||
 | 
					    else  // Condition matched.
 | 
				
			||||||
 | 
					      if (FileCtimeAfterOR) 
 | 
				
			||||||
 | 
					        return false; // Include file in OR mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (FileAtimeBefore.IsSet()) // Filter present.
 | 
				
			||||||
 | 
					    if (fta>=FileAtimeBefore) // Condition not matched.
 | 
				
			||||||
 | 
					      if (FileAtimeBeforeOR) 
 | 
				
			||||||
 | 
					        FilterOR=true; // Not matched OR filter is present.
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return true; // Exclude file in AND mode.
 | 
				
			||||||
 | 
					    else  // Condition matched.
 | 
				
			||||||
 | 
					      if (FileAtimeBeforeOR) 
 | 
				
			||||||
 | 
					        return false; // Include file in OR mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (FileAtimeAfter.IsSet()) // Filter present.
 | 
				
			||||||
 | 
					    if (fta<FileAtimeAfter) // Condition not matched.
 | 
				
			||||||
 | 
					      if (FileAtimeAfterOR) 
 | 
				
			||||||
 | 
					        FilterOR=true; // Not matched OR filter is present.
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return true; // Exclude file in AND mode.
 | 
				
			||||||
 | 
					    else  // Condition matched.
 | 
				
			||||||
 | 
					      if (FileAtimeAfterOR) 
 | 
				
			||||||
 | 
					        return false; // Include file in OR mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return FilterOR; // Exclude if all OR filters are not matched.
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					// Return 'true' if we need to exclude the file from processing.
 | 
				
			||||||
 | 
					bool CommandData::SizeCheck(int64 Size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (FileSizeLess!=INT64NDF && Size>=FileSizeLess)
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  if (FileSizeMore!=INT64NDF && Size<=FileSizeMore)
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Return 0 if file must not be processed or a number of matched parameter otherwise.
 | 
				
			||||||
 | 
					int CommandData::IsProcessFile(FileHeader &FileHead,bool *ExactMatch,int MatchType,
 | 
				
			||||||
 | 
					                               bool Flags,wchar *MatchedArg,uint MatchedArgSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (MatchedArg!=NULL && MatchedArgSize>0)
 | 
				
			||||||
 | 
					    *MatchedArg=0;
 | 
				
			||||||
 | 
					  bool Dir=FileHead.Dir;
 | 
				
			||||||
 | 
					  if (ExclCheck(FileHead.FileName,Dir,false,true))
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					  if (TimeCheck(FileHead.mtime,FileHead.ctime,FileHead.atime))
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  if ((FileHead.FileAttr & ExclFileAttr)!=0 || FileHead.Dir && ExclDir)
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  if (InclAttrSet && (!FileHead.Dir && (FileHead.FileAttr & InclFileAttr)==0 ||
 | 
				
			||||||
 | 
					      FileHead.Dir && !InclDir))
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  if (!Dir && SizeCheck(FileHead.UnpSize))
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  wchar *ArgName;
 | 
				
			||||||
 | 
					  FileArgs.Rewind();
 | 
				
			||||||
 | 
					  for (int StringCount=1;(ArgName=FileArgs.GetString())!=NULL;StringCount++)
 | 
				
			||||||
 | 
					    if (CmpName(ArgName,FileHead.FileName,MatchType))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (ExactMatch!=NULL)
 | 
				
			||||||
 | 
					        *ExactMatch=wcsicompc(ArgName,FileHead.FileName)==0;
 | 
				
			||||||
 | 
					      if (MatchedArg!=NULL)
 | 
				
			||||||
 | 
					        wcsncpyz(MatchedArg,ArgName,MatchedArgSize);
 | 
				
			||||||
 | 
					      return StringCount;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					void CommandData::SetStoreTimeMode(const wchar *S)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (*S==0 || IsDigit(*S) || *S=='-' || *S=='+')
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Apply -ts, -ts1, -ts-, -ts+ to all 3 times.
 | 
				
			||||||
 | 
					    // Handle obsolete -ts[2,3,4] as ts+.
 | 
				
			||||||
 | 
					    EXTTIME_MODE Mode=EXTTIME_MAX;
 | 
				
			||||||
 | 
					    if (*S=='-')
 | 
				
			||||||
 | 
					      Mode=EXTTIME_NONE;
 | 
				
			||||||
 | 
					    if (*S=='1')
 | 
				
			||||||
 | 
					      Mode=EXTTIME_1S;
 | 
				
			||||||
 | 
					    xmtime=xctime=xatime=Mode;
 | 
				
			||||||
 | 
					    S++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (*S!=0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    EXTTIME_MODE Mode=EXTTIME_MAX;
 | 
				
			||||||
 | 
					    if (S[1]=='-')
 | 
				
			||||||
 | 
					      Mode=EXTTIME_NONE;
 | 
				
			||||||
 | 
					    if (S[1]=='1')
 | 
				
			||||||
 | 
					      Mode=EXTTIME_1S;
 | 
				
			||||||
 | 
					    switch(toupperw(*S))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case 'M':
 | 
				
			||||||
 | 
					        xmtime=Mode;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'C':
 | 
				
			||||||
 | 
					        xctime=Mode;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'A':
 | 
				
			||||||
 | 
					        xatime=Mode;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'P':
 | 
				
			||||||
 | 
					        PreserveAtime=true;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    S++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,118 @@
 | 
				
			||||||
 | 
					void CommandData::OutTitle()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (BareOutput || DisableCopyright)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					#if defined(__GNUC__) && defined(SFX_MODULE)
 | 
				
			||||||
 | 
					  mprintf(St(MCopyrightS));
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifndef SILENT
 | 
				
			||||||
 | 
					  static bool TitleShown=false;
 | 
				
			||||||
 | 
					  if (TitleShown)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  TitleShown=true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wchar Version[80];
 | 
				
			||||||
 | 
					  if (RARVER_BETA!=0)
 | 
				
			||||||
 | 
					    swprintf(Version,ASIZE(Version),L"%d.%02d %ls %d",RARVER_MAJOR,RARVER_MINOR,St(MBeta),RARVER_BETA);
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    swprintf(Version,ASIZE(Version),L"%d.%02d",RARVER_MAJOR,RARVER_MINOR);
 | 
				
			||||||
 | 
					#if defined(_WIN_32) || defined(_WIN_64)
 | 
				
			||||||
 | 
					  wcsncatz(Version,L" ",ASIZE(Version));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef _WIN_32
 | 
				
			||||||
 | 
					  wcsncatz(Version,St(Mx86),ASIZE(Version));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef _WIN_64
 | 
				
			||||||
 | 
					  wcsncatz(Version,St(Mx64),ASIZE(Version));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  if (PrintVersion)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    mprintf(L"%s",Version);
 | 
				
			||||||
 | 
					    exit(0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  mprintf(St(MUCopyright),Version,RARVER_YEAR);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool CmpMSGID(MSGID i1,MSGID i2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef MSGID_INT
 | 
				
			||||||
 | 
					  return i1==i2;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  // If MSGID is const char*, we cannot compare pointers only.
 | 
				
			||||||
 | 
					  // Pointers to different instances of same string can differ,
 | 
				
			||||||
 | 
					  // so we need to compare complete strings.
 | 
				
			||||||
 | 
					  return wcscmp(i1,i2)==0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CommandData::OutHelp(RAR_EXIT ExitCode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if !defined(SILENT)
 | 
				
			||||||
 | 
					  OutTitle();
 | 
				
			||||||
 | 
					  static MSGID Help[]={
 | 
				
			||||||
 | 
					#ifdef SFX_MODULE
 | 
				
			||||||
 | 
					    // Console SFX switches definition.
 | 
				
			||||||
 | 
					    MCHelpCmd,MSHelpCmdE,MSHelpCmdT,MSHelpCmdV
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    // UnRAR switches definition.
 | 
				
			||||||
 | 
					    MUNRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdE,MCHelpCmdL,
 | 
				
			||||||
 | 
					    MCHelpCmdP,MCHelpCmdT,MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm,
 | 
				
			||||||
 | 
					    MCHelpSwAT,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG,MCHelpSwAI,MCHelpSwAP,
 | 
				
			||||||
 | 
					    MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,
 | 
				
			||||||
 | 
					    MCHelpSwDH,MCHelpSwEP,MCHelpSwEP3,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR,
 | 
				
			||||||
 | 
					    MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwN,MCHelpSwNa,MCHelpSwNal,
 | 
				
			||||||
 | 
					    MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOR,MCHelpSwOW,MCHelpSwP,
 | 
				
			||||||
 | 
					    MCHelpSwPm,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSL,MCHelpSwSM,
 | 
				
			||||||
 | 
					    MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU,
 | 
				
			||||||
 | 
					    MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal,
 | 
				
			||||||
 | 
					    MCHelpSwY
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (uint I=0;I<ASIZE(Help);I++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					    if (CmpMSGID(Help[I],MCHelpSwV))
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					#ifndef _WIN_ALL
 | 
				
			||||||
 | 
					    static MSGID Win32Only[]={
 | 
				
			||||||
 | 
					      MCHelpSwIEML,MCHelpSwVD,MCHelpSwAO,MCHelpSwOS,MCHelpSwIOFF,
 | 
				
			||||||
 | 
					      MCHelpSwEP2,MCHelpSwOC,MCHelpSwONI,MCHelpSwDR,MCHelpSwRI
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    bool Found=false;
 | 
				
			||||||
 | 
					    for (uint J=0;J<ASIZE(Win32Only);J++)
 | 
				
			||||||
 | 
					      if (CmpMSGID(Help[I],Win32Only[J]))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        Found=true;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    if (Found)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(_UNIX) && !defined(_WIN_ALL)
 | 
				
			||||||
 | 
					    if (CmpMSGID(Help[I],MCHelpSwOW))
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(_WIN_ALL) && !defined(_EMX)
 | 
				
			||||||
 | 
					    if (CmpMSGID(Help[I],MCHelpSwAC))
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef SAVE_LINKS
 | 
				
			||||||
 | 
					    if (CmpMSGID(Help[I],MCHelpSwOL))
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef RAR_SMP
 | 
				
			||||||
 | 
					    if (CmpMSGID(Help[I],MCHelpSwMT))
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    mprintf(St(Help[I]));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  mprintf(L"\n");
 | 
				
			||||||
 | 
					  ErrHandler.Exit(ExitCode);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,6 @@
 | 
				
			||||||
 *  Contents: 'Carryless rangecoder' by Dmitry Subbotin                     *
 | 
					 *  Contents: 'Carryless rangecoder' by Dmitry Subbotin                     *
 | 
				
			||||||
 ****************************************************************************/
 | 
					 ****************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const uint TOP=1 << 24, BOT=1 << 15;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RangeCoder
 | 
					class RangeCoder
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,36 +1,59 @@
 | 
				
			||||||
#ifndef _RAR_COMPRESS_
 | 
					#ifndef _RAR_COMPRESS_
 | 
				
			||||||
#define _RAR_COMPRESS_
 | 
					#define _RAR_COMPRESS_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ComprDataIO;
 | 
					// Combine pack and unpack constants to class to avoid polluting global
 | 
				
			||||||
class PackingFileTable;
 | 
					// namespace with numerous short names.
 | 
				
			||||||
 | 
					class PackDef
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
					    // Maximum LZ match length we can encode even for short distances.
 | 
				
			||||||
 | 
					    static const uint MAX_LZ_MATCH = 0x1001;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CODEBUFSIZE     0x4000
 | 
					    // We increment LZ match length for longer distances, because shortest
 | 
				
			||||||
#define MAXWINSIZE      0x400000
 | 
					    // matches are not allowed for them. Maximum length increment is 3
 | 
				
			||||||
#define MAXWINMASK      (MAXWINSIZE-1)
 | 
					    // for distances larger than 256KB (0x40000). Here we define the maximum
 | 
				
			||||||
 | 
					    // incremented LZ match. Normally packer does not use it, but we must be
 | 
				
			||||||
 | 
					    // ready to process it in corrupt archives.
 | 
				
			||||||
 | 
					    static const uint MAX_INC_LZ_MATCH = MAX_LZ_MATCH + 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LOW_DIST_REP_COUNT 16
 | 
					    static const uint MAX3_LZ_MATCH = 0x101; // Maximum match length for RAR v3.
 | 
				
			||||||
 | 
					    static const uint LOW_DIST_REP_COUNT = 16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NC 299  /* alphabet = {0, 1, 2, ..., NC - 1} */
 | 
					    static const uint NC    = 306; /* alphabet = {0, 1, 2, ..., NC - 1} */
 | 
				
			||||||
#define DC  60
 | 
					    static const uint DC    = 64;
 | 
				
			||||||
#define LDC 17
 | 
					    static const uint LDC   = 16;
 | 
				
			||||||
#define RC  28
 | 
					    static const uint RC    = 44;
 | 
				
			||||||
#define HUFF_TABLE_SIZE (NC+DC+RC+LDC)
 | 
					    static const uint HUFF_TABLE_SIZE = NC + DC + RC + LDC;
 | 
				
			||||||
#define BC  20
 | 
					    static const uint BC    = 20;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NC20 298  /* alphabet = {0, 1, 2, ..., NC - 1} */
 | 
					    static const uint NC30  = 299; /* alphabet = {0, 1, 2, ..., NC - 1} */
 | 
				
			||||||
#define DC20 48
 | 
					    static const uint DC30  = 60;
 | 
				
			||||||
#define RC20 28
 | 
					    static const uint LDC30 = 17;
 | 
				
			||||||
#define BC20 19
 | 
					    static const uint RC30  = 28;
 | 
				
			||||||
#define MC20 257
 | 
					    static const uint BC30  = 20;
 | 
				
			||||||
 | 
					    static const uint HUFF_TABLE_SIZE30 = NC30 + DC30 + RC30 + LDC30;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {CODE_HUFFMAN,CODE_LZ,CODE_LZ2,CODE_REPEATLZ,CODE_CACHELZ,
 | 
					    static const uint NC20  = 298; /* alphabet = {0, 1, 2, ..., NC - 1} */
 | 
				
			||||||
      CODE_STARTFILE,CODE_ENDFILE,CODE_VM,CODE_VMDATA};
 | 
					    static const uint DC20  = 48;
 | 
				
			||||||
 | 
					    static const uint RC20  = 28;
 | 
				
			||||||
 | 
					    static const uint BC20  = 19;
 | 
				
			||||||
 | 
					    static const uint MC20  = 257;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Largest alphabet size among all values listed above.
 | 
				
			||||||
 | 
					    static const uint LARGEST_TABLE_SIZE = 306;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    enum {
 | 
				
			||||||
 | 
					      CODE_HUFFMAN, CODE_LZ, CODE_REPEATLZ, CODE_CACHELZ, CODE_STARTFILE,
 | 
				
			||||||
 | 
					      CODE_ENDFILE, CODE_FILTER, CODE_FILTERDATA
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum FilterType {
 | 
					enum FilterType {
 | 
				
			||||||
  FILTER_NONE, FILTER_PPM /*dummy*/, FILTER_E8, FILTER_E8E9,
 | 
					  // These values must not be changed, because we use them directly
 | 
				
			||||||
  FILTER_UPCASETOLOW, FILTER_AUDIO, FILTER_RGB, FILTER_DELTA,
 | 
					  // in RAR5 compression and decompression code.
 | 
				
			||||||
  FILTER_ITANIUM, FILTER_E8E9V2
 | 
					  FILTER_DELTA=0, FILTER_E8, FILTER_E8E9, FILTER_ARM, 
 | 
				
			||||||
 | 
					  FILTER_AUDIO, FILTER_RGB, FILTER_ITANIUM, FILTER_PPM, FILTER_NONE
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,220 +1,291 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef GUI
 | 
					 | 
				
			||||||
#include "log.cpp"
 | 
					#include "log.cpp"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int KbdAnsi(char *Addr,int Size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(GUI) && !defined(SILENT)
 | 
					 | 
				
			||||||
static void RawPrint(char *Msg,MESSAGE_TYPE MessageType);
 | 
					 | 
				
			||||||
static uint GetKey();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static MESSAGE_TYPE MsgStream=MSG_STDOUT;
 | 
					static MESSAGE_TYPE MsgStream=MSG_STDOUT;
 | 
				
			||||||
static bool Sound=false;
 | 
					static RAR_CHARSET RedirectCharset=RCH_DEFAULT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const int MaxMsgSize=2*NM+2048;
 | 
					const int MaxMsgSize=2*NM+2048;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void InitConsoleOptions(MESSAGE_TYPE MsgStream,bool Sound)
 | 
					static bool StdoutRedirected=false,StderrRedirected=false,StdinRedirected=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					static bool IsRedirected(DWORD nStdHandle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ::MsgStream=MsgStream;
 | 
					  HANDLE hStd=GetStdHandle(nStdHandle);
 | 
				
			||||||
  ::Sound=Sound;
 | 
					  DWORD Mode;
 | 
				
			||||||
 | 
					  return GetFileType(hStd)!=FILE_TYPE_CHAR || GetConsoleMode(hStd,&Mode)==0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void InitConsole()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  // We want messages like file names or progress percent to be printed
 | 
				
			||||||
 | 
					  // immediately. Use only in Windows, in Unix they can cause wprintf %ls
 | 
				
			||||||
 | 
					  // to fail with non-English strings.
 | 
				
			||||||
 | 
					  setbuf(stdout,NULL);
 | 
				
			||||||
 | 
					  setbuf(stderr,NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Detect if output is redirected and set output mode properly.
 | 
				
			||||||
 | 
					  // We do not want to send Unicode output to files and especially to pipes
 | 
				
			||||||
 | 
					  // like '|more', which cannot handle them correctly in Windows.
 | 
				
			||||||
 | 
					  // In Unix console output is UTF-8 and it is handled correctly
 | 
				
			||||||
 | 
					  // when redirecting, so no need to perform any adjustments.
 | 
				
			||||||
 | 
					  StdoutRedirected=IsRedirected(STD_OUTPUT_HANDLE);
 | 
				
			||||||
 | 
					  StderrRedirected=IsRedirected(STD_ERROR_HANDLE);
 | 
				
			||||||
 | 
					  StdinRedirected=IsRedirected(STD_INPUT_HANDLE);
 | 
				
			||||||
 | 
					#ifdef _MSC_VER
 | 
				
			||||||
 | 
					  if (!StdoutRedirected)
 | 
				
			||||||
 | 
					    _setmode(_fileno(stdout), _O_U16TEXT);
 | 
				
			||||||
 | 
					  if (!StderrRedirected)
 | 
				
			||||||
 | 
					    _setmode(_fileno(stderr), _O_U16TEXT);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#elif defined(_UNIX)
 | 
				
			||||||
 | 
					  StdoutRedirected=!isatty(fileno(stdout));
 | 
				
			||||||
 | 
					  StderrRedirected=!isatty(fileno(stderr));
 | 
				
			||||||
 | 
					  StdinRedirected=!isatty(fileno(stdin));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(GUI) && !defined(SILENT)
 | 
					
 | 
				
			||||||
void mprintf(const char *fmt,...)
 | 
					void SetConsoleMsgStream(MESSAGE_TYPE MsgStream)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  ::MsgStream=MsgStream;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  ::RedirectCharset=RedirectCharset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SILENT
 | 
				
			||||||
 | 
					static void cvt_wprintf(FILE *dest,const wchar *fmt,va_list arglist)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // This buffer is for format string only, not for entire output,
 | 
				
			||||||
 | 
					  // so it can be short enough.
 | 
				
			||||||
 | 
					  wchar fmtw[1024];
 | 
				
			||||||
 | 
					  PrintfPrepareFmt(fmt,fmtw,ASIZE(fmtw));
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  safebuf wchar Msg[MaxMsgSize];
 | 
				
			||||||
 | 
					  if (dest==stdout && StdoutRedirected || dest==stderr && StderrRedirected)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    HANDLE hOut=GetStdHandle(dest==stdout ? STD_OUTPUT_HANDLE:STD_ERROR_HANDLE);
 | 
				
			||||||
 | 
					    vswprintf(Msg,ASIZE(Msg),fmtw,arglist);
 | 
				
			||||||
 | 
					    DWORD Written;
 | 
				
			||||||
 | 
					    if (RedirectCharset==RCH_UNICODE)
 | 
				
			||||||
 | 
					      WriteFile(hOut,Msg,(DWORD)wcslen(Msg)*sizeof(*Msg),&Written,NULL);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // Avoid Unicode for redirect in Windows, it does not work with pipes.
 | 
				
			||||||
 | 
					      safebuf char MsgA[MaxMsgSize];
 | 
				
			||||||
 | 
					      if (RedirectCharset==RCH_UTF8)
 | 
				
			||||||
 | 
					        WideToUtf(Msg,MsgA,ASIZE(MsgA));
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        WideToChar(Msg,MsgA,ASIZE(MsgA));
 | 
				
			||||||
 | 
					      if (RedirectCharset==RCH_DEFAULT || RedirectCharset==RCH_OEM)
 | 
				
			||||||
 | 
					        CharToOemA(MsgA,MsgA); // Console tools like 'more' expect OEM encoding.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // We already converted \n to \r\n above, so we use WriteFile instead
 | 
				
			||||||
 | 
					      // of C library to avoid unnecessary additional conversion.
 | 
				
			||||||
 | 
					      WriteFile(hOut,MsgA,(DWORD)strlen(MsgA),&Written,NULL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // MSVC2008 vfwprintf writes every character to console separately
 | 
				
			||||||
 | 
					  // and it is too slow. We use direct WriteConsole call instead.
 | 
				
			||||||
 | 
					  vswprintf(Msg,ASIZE(Msg),fmtw,arglist);
 | 
				
			||||||
 | 
					  HANDLE hOut=GetStdHandle(dest==stderr ? STD_ERROR_HANDLE:STD_OUTPUT_HANDLE);
 | 
				
			||||||
 | 
					  DWORD Written;
 | 
				
			||||||
 | 
					  WriteConsole(hOut,Msg,(DWORD)wcslen(Msg),&Written,NULL);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  vfwprintf(dest,fmtw,arglist);
 | 
				
			||||||
 | 
					  // We do not use setbuf(NULL) in Unix (see comments in InitConsole).
 | 
				
			||||||
 | 
					  fflush(dest);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mprintf(const wchar *fmt,...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (MsgStream==MSG_NULL || MsgStream==MSG_ERRONLY)
 | 
					  if (MsgStream==MSG_NULL || MsgStream==MSG_ERRONLY)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  safebuf char Msg[MaxMsgSize];
 | 
					
 | 
				
			||||||
  va_list argptr;
 | 
					  fflush(stderr); // Ensure proper message order.
 | 
				
			||||||
  va_start(argptr,fmt);
 | 
					
 | 
				
			||||||
  vsprintf(Msg,fmt,argptr);
 | 
					  va_list arglist;
 | 
				
			||||||
  RawPrint(Msg,MsgStream);
 | 
					  va_start(arglist,fmt);
 | 
				
			||||||
  va_end(argptr);
 | 
					  FILE *dest=MsgStream==MSG_STDERR ? stderr:stdout;
 | 
				
			||||||
 | 
					  cvt_wprintf(dest,fmt,arglist);
 | 
				
			||||||
 | 
					  va_end(arglist);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(GUI) && !defined(SILENT)
 | 
					#ifndef SILENT
 | 
				
			||||||
void eprintf(const char *fmt,...)
 | 
					void eprintf(const wchar *fmt,...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (MsgStream==MSG_NULL)
 | 
					  if (MsgStream==MSG_NULL)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  safebuf char Msg[MaxMsgSize];
 | 
					 | 
				
			||||||
  va_list argptr;
 | 
					 | 
				
			||||||
  va_start(argptr,fmt);
 | 
					 | 
				
			||||||
  vsprintf(Msg,fmt,argptr);
 | 
					 | 
				
			||||||
  RawPrint(Msg,MSG_STDERR);
 | 
					 | 
				
			||||||
  va_end(argptr);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fflush(stdout); // Ensure proper message order.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(GUI) && !defined(SILENT)
 | 
					  va_list arglist;
 | 
				
			||||||
void RawPrint(char *Msg,MESSAGE_TYPE MessageType)
 | 
					  va_start(arglist,fmt);
 | 
				
			||||||
{
 | 
					  cvt_wprintf(stderr,fmt,arglist);
 | 
				
			||||||
  File OutFile;
 | 
					  va_end(arglist);
 | 
				
			||||||
  switch(MessageType)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    case MSG_STDOUT:
 | 
					 | 
				
			||||||
      OutFile.SetHandleType(FILE_HANDLESTD);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case MSG_STDERR:
 | 
					 | 
				
			||||||
    case MSG_ERRONLY:
 | 
					 | 
				
			||||||
      OutFile.SetHandleType(FILE_HANDLEERR);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
      return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  CharToOem(Msg,Msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  char OutMsg[MaxMsgSize],*OutPos=OutMsg;
 | 
					 | 
				
			||||||
  for (int I=0;Msg[I]!=0;I++)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (Msg[I]=='\n' && (I==0 || Msg[I-1]!='\r'))
 | 
					 | 
				
			||||||
      *(OutPos++)='\r';
 | 
					 | 
				
			||||||
    *(OutPos++)=Msg[I];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  *OutPos=0;
 | 
					 | 
				
			||||||
  strcpy(Msg,OutMsg);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if defined(_UNIX) || defined(_EMX)
 | 
					 | 
				
			||||||
  char OutMsg[MaxMsgSize],*OutPos=OutMsg;
 | 
					 | 
				
			||||||
  for (int I=0;Msg[I]!=0;I++)
 | 
					 | 
				
			||||||
    if (Msg[I]!='\r')
 | 
					 | 
				
			||||||
      *(OutPos++)=Msg[I];
 | 
					 | 
				
			||||||
  *OutPos=0;
 | 
					 | 
				
			||||||
  strcpy(Msg,OutMsg);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  OutFile.Write(Msg,strlen(Msg));
 | 
					 | 
				
			||||||
//  OutFile.Flush();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SILENT
 | 
					#ifndef SILENT
 | 
				
			||||||
void Alarm()
 | 
					static void GetPasswordText(wchar *Str,uint MaxLength)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					  if (MaxLength==0)
 | 
				
			||||||
  if (Sound)
 | 
					    return;
 | 
				
			||||||
    putchar('\007');
 | 
					  if (StdinRedirected)
 | 
				
			||||||
#endif
 | 
					    getwstr(Str,MaxLength); // Read from pipe or redirected file.
 | 
				
			||||||
}
 | 
					  else
 | 
				
			||||||
#endif
 | 
					  {
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					    HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE);
 | 
				
			||||||
 | 
					    HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE);
 | 
				
			||||||
 | 
					    DWORD ConInMode,ConOutMode;
 | 
				
			||||||
 | 
					    DWORD Read=0;
 | 
				
			||||||
 | 
					    GetConsoleMode(hConIn,&ConInMode);
 | 
				
			||||||
 | 
					    GetConsoleMode(hConOut,&ConOutMode);
 | 
				
			||||||
 | 
					    SetConsoleMode(hConIn,ENABLE_LINE_INPUT);
 | 
				
			||||||
 | 
					    SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ReadConsole(hConIn,Str,MaxLength-1,&Read,NULL);
 | 
				
			||||||
#ifndef SILENT
 | 
					    Str[Read]=0;
 | 
				
			||||||
#ifndef GUI
 | 
					    SetConsoleMode(hConIn,ConInMode);
 | 
				
			||||||
void GetPasswordText(char *Str,int MaxLength)
 | 
					    SetConsoleMode(hConOut,ConOutMode);
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE);
 | 
					 | 
				
			||||||
  HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE);
 | 
					 | 
				
			||||||
  DWORD ConInMode,ConOutMode;
 | 
					 | 
				
			||||||
  DWORD Read=0;
 | 
					 | 
				
			||||||
  GetConsoleMode(hConIn,&ConInMode);
 | 
					 | 
				
			||||||
  GetConsoleMode(hConOut,&ConOutMode);
 | 
					 | 
				
			||||||
  SetConsoleMode(hConIn,ENABLE_LINE_INPUT);
 | 
					 | 
				
			||||||
  SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT);
 | 
					 | 
				
			||||||
  ReadConsole(hConIn,Str,MaxLength-1,&Read,NULL);
 | 
					 | 
				
			||||||
  Str[Read]=0;
 | 
					 | 
				
			||||||
  OemToChar(Str,Str);
 | 
					 | 
				
			||||||
  SetConsoleMode(hConIn,ConInMode);
 | 
					 | 
				
			||||||
  SetConsoleMode(hConOut,ConOutMode);
 | 
					 | 
				
			||||||
#elif defined(_EMX) || defined(_BEOS) || defined(__sparc) || defined(sparc) || defined (__VMS)
 | 
					 | 
				
			||||||
  fgets(Str,MaxLength-1,stdin);
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  strncpyz(Str,getpass(""),MaxLength);
 | 
					    char StrA[MAXPASSWORD];
 | 
				
			||||||
 | 
					#if defined(_EMX) || defined (__VMS)
 | 
				
			||||||
 | 
					    fgets(StrA,ASIZE(StrA)-1,stdin);
 | 
				
			||||||
 | 
					#elif defined(__sun)
 | 
				
			||||||
 | 
					    strncpyz(StrA,getpassphrase(""),ASIZE(StrA));
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    strncpyz(StrA,getpass(""),ASIZE(StrA));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					    CharToWide(StrA,Str,MaxLength);
 | 
				
			||||||
 | 
					    cleandata(StrA,sizeof(StrA));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  Str[MaxLength-1]=0;
 | 
					  Str[MaxLength-1]=0;
 | 
				
			||||||
  RemoveLF(Str);
 | 
					  RemoveLF(Str);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SILENT
 | 
				
			||||||
 | 
					bool GetConsolePassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *Password)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!StdinRedirected)
 | 
				
			||||||
 | 
					    uiAlarm(UIALARM_QUESTION);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  while (true)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (!StdinRedirected)
 | 
				
			||||||
 | 
					      if (Type==UIPASSWORD_GLOBAL)
 | 
				
			||||||
 | 
					        eprintf(L"\n%s: ",St(MAskPsw));
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        eprintf(St(MAskPswFor),FileName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wchar PlainPsw[MAXPASSWORD];
 | 
				
			||||||
 | 
					    GetPasswordText(PlainPsw,ASIZE(PlainPsw));
 | 
				
			||||||
 | 
					    if (*PlainPsw==0 && Type==UIPASSWORD_GLOBAL)
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    if (!StdinRedirected && Type==UIPASSWORD_GLOBAL)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      eprintf(St(MReAskPsw));
 | 
				
			||||||
 | 
					      wchar CmpStr[MAXPASSWORD];
 | 
				
			||||||
 | 
					      GetPasswordText(CmpStr,ASIZE(CmpStr));
 | 
				
			||||||
 | 
					      if (*CmpStr==0 || wcscmp(PlainPsw,CmpStr)!=0)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        eprintf(St(MNotMatchPsw));
 | 
				
			||||||
 | 
					        cleandata(PlainPsw,sizeof(PlainPsw));
 | 
				
			||||||
 | 
					        cleandata(CmpStr,sizeof(CmpStr));
 | 
				
			||||||
 | 
					        continue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      cleandata(CmpStr,sizeof(CmpStr));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Password->Set(PlainPsw);
 | 
				
			||||||
 | 
					    cleandata(PlainPsw,sizeof(PlainPsw));
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SILENT
 | 
					#ifndef SILENT
 | 
				
			||||||
bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength)
 | 
					bool getwstr(wchar *str,size_t n)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Alarm();
 | 
					  // Print buffered prompt title function before waiting for input.
 | 
				
			||||||
  while (true)
 | 
					  fflush(stderr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *str=0;
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
 | 
					  // fgetws does not work well with non-English text in Windows,
 | 
				
			||||||
 | 
					  // so we do not use it.
 | 
				
			||||||
 | 
					  if (StdinRedirected) // ReadConsole does not work if redirected.
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    char PromptStr[NM+256];
 | 
					    // fgets does not work well with pipes in Windows in our test.
 | 
				
			||||||
#if defined(_EMX) || defined(_BEOS)
 | 
					    // Let's use files.
 | 
				
			||||||
    strcpy(PromptStr,St(MAskPswEcho));
 | 
					    Array<char> StrA(n*4); // Up to 4 UTF-8 characters per wchar_t.
 | 
				
			||||||
#else
 | 
					    File SrcFile;
 | 
				
			||||||
    strcpy(PromptStr,St(MAskPsw));
 | 
					    SrcFile.SetHandleType(FILE_HANDLESTD);
 | 
				
			||||||
#endif
 | 
					    int ReadSize=SrcFile.Read(&StrA[0],StrA.Size()-1);
 | 
				
			||||||
    if (Type!=PASSWORD_GLOBAL)
 | 
					    if (ReadSize<=0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      strcat(PromptStr,St(MFor));
 | 
					      // Looks like stdin is a null device. We can enter to infinite loop
 | 
				
			||||||
      char *NameOnly=PointToName(FileName);
 | 
					      // calling Ask(), so let's better exit.
 | 
				
			||||||
      if (strlen(PromptStr)+strlen(NameOnly)<ASIZE(PromptStr))
 | 
					      ErrHandler.Exit(RARX_USERBREAK);
 | 
				
			||||||
        strcat(PromptStr,NameOnly);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    eprintf("\n%s: ",PromptStr);
 | 
					    StrA[ReadSize]=0;
 | 
				
			||||||
    GetPasswordText(Password,MaxLength);
 | 
					    CharToWide(&StrA[0],str,n);
 | 
				
			||||||
    if (*Password==0 && Type==PASSWORD_GLOBAL)
 | 
					    cleandata(&StrA[0],StrA.Size()); // We can use this function to enter passwords.
 | 
				
			||||||
      return(false);
 | 
					 | 
				
			||||||
    if (Type==PASSWORD_GLOBAL)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      eprintf(St(MReAskPsw));
 | 
					 | 
				
			||||||
      char CmpStr[MAXPASSWORD];
 | 
					 | 
				
			||||||
      GetPasswordText(CmpStr,ASIZE(CmpStr));
 | 
					 | 
				
			||||||
      if (*CmpStr==0 || strcmp(Password,CmpStr)!=0)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        eprintf(St(MNotMatchPsw));
 | 
					 | 
				
			||||||
        memset(Password,0,MaxLength);
 | 
					 | 
				
			||||||
        memset(CmpStr,0,sizeof(CmpStr));
 | 
					 | 
				
			||||||
        continue;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      memset(CmpStr,0,sizeof(CmpStr));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    break;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(true);
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    DWORD ReadSize=0;
 | 
				
			||||||
 | 
					    if (ReadConsole(GetStdHandle(STD_INPUT_HANDLE),str,DWORD(n-1),&ReadSize,NULL)==0)
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    str[ReadSize]=0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  if (fgetws(str,n,stdin)==NULL)
 | 
				
			||||||
 | 
					    ErrHandler.Exit(RARX_USERBREAK); // Avoid infinite Ask() loop.
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  RemoveLF(str);
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(GUI) && !defined(SILENT)
 | 
					#ifndef SILENT
 | 
				
			||||||
uint GetKey()
 | 
					// We allow this function to return 0 in case of invalid input,
 | 
				
			||||||
 | 
					// because it might be convenient to press Enter to some not dangerous
 | 
				
			||||||
 | 
					// prompts like "insert disk with next volume". We should call this function
 | 
				
			||||||
 | 
					// again in case of 0 in dangerous prompt such as overwriting file.
 | 
				
			||||||
 | 
					int Ask(const wchar *AskStr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char Str[80];
 | 
					  uiAlarm(UIALARM_QUESTION);
 | 
				
			||||||
  bool EndOfFile;
 | 
					 | 
				
			||||||
#if defined(__GNUC__) || defined(sun)
 | 
					 | 
				
			||||||
  EndOfFile=(fgets(Str,sizeof(Str),stdin)==NULL);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  File SrcFile;
 | 
					 | 
				
			||||||
  SrcFile.SetHandleType(FILE_HANDLESTD);
 | 
					 | 
				
			||||||
  EndOfFile=(SrcFile.Read(Str,sizeof(Str))==0);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  if (EndOfFile)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    // Looks like stdin is a null device. We can enter to infinite loop
 | 
					 | 
				
			||||||
    // calling Ask(), so let's better exit.
 | 
					 | 
				
			||||||
    ErrHandler.Exit(USER_BREAK);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return(Str[0]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(GUI) && !defined(SILENT)
 | 
					 | 
				
			||||||
int Ask(const char *AskStr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  const int MaxItems=10;
 | 
					  const int MaxItems=10;
 | 
				
			||||||
  char Item[MaxItems][40];
 | 
					  wchar Item[MaxItems][40];
 | 
				
			||||||
  int ItemKeyPos[MaxItems],NumItems=0;
 | 
					  int ItemKeyPos[MaxItems],NumItems=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (const char *NextItem=AskStr;NextItem!=NULL;NextItem=strchr(NextItem+1,'_'))
 | 
					  for (const wchar *NextItem=AskStr;NextItem!=NULL;NextItem=wcschr(NextItem+1,'_'))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    char *CurItem=Item[NumItems];
 | 
					    wchar *CurItem=Item[NumItems];
 | 
				
			||||||
    strncpyz(CurItem,NextItem+1,ASIZE(Item[0]));
 | 
					    wcsncpyz(CurItem,NextItem+1,ASIZE(Item[0]));
 | 
				
			||||||
    char *EndItem=strchr(CurItem,'_');
 | 
					    wchar *EndItem=wcschr(CurItem,'_');
 | 
				
			||||||
    if (EndItem!=NULL)
 | 
					    if (EndItem!=NULL)
 | 
				
			||||||
      *EndItem=0;
 | 
					      *EndItem=0;
 | 
				
			||||||
    int KeyPos=0,CurKey;
 | 
					    int KeyPos=0,CurKey;
 | 
				
			||||||
| 
						 | 
					@ -222,7 +293,7 @@ int Ask(const char *AskStr)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      bool Found=false;
 | 
					      bool Found=false;
 | 
				
			||||||
      for (int I=0;I<NumItems && !Found;I++)
 | 
					      for (int I=0;I<NumItems && !Found;I++)
 | 
				
			||||||
        if (loctoupper(Item[I][ItemKeyPos[I]])==loctoupper(CurKey))
 | 
					        if (toupperw(Item[I][ItemKeyPos[I]])==toupperw(CurKey))
 | 
				
			||||||
          Found=true;
 | 
					          Found=true;
 | 
				
			||||||
      if (!Found && CurKey!=' ')
 | 
					      if (!Found && CurKey!=' ')
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
| 
						 | 
					@ -234,61 +305,53 @@ int Ask(const char *AskStr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (int I=0;I<NumItems;I++)
 | 
					  for (int I=0;I<NumItems;I++)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    eprintf(I==0 ? (NumItems>4 ? "\n":" "):", ");
 | 
					    eprintf(I==0 ? (NumItems>4 ? L"\n":L" "):L", ");
 | 
				
			||||||
    int KeyPos=ItemKeyPos[I];
 | 
					    int KeyPos=ItemKeyPos[I];
 | 
				
			||||||
    for (int J=0;J<KeyPos;J++)
 | 
					    for (int J=0;J<KeyPos;J++)
 | 
				
			||||||
      eprintf("%c",Item[I][J]);
 | 
					      eprintf(L"%c",Item[I][J]);
 | 
				
			||||||
    eprintf("[%c]%s",Item[I][KeyPos],&Item[I][KeyPos+1]);
 | 
					    eprintf(L"[%c]%ls",Item[I][KeyPos],&Item[I][KeyPos+1]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  eprintf(" ");
 | 
					  eprintf(L" ");
 | 
				
			||||||
  int Ch=GetKey();
 | 
					  wchar Str[50];
 | 
				
			||||||
#if defined(_WIN_32)
 | 
					  getwstr(Str,ASIZE(Str));
 | 
				
			||||||
  OemToCharBuff((LPCSTR)&Ch,(LPTSTR)&Ch,1);
 | 
					  wchar Ch=toupperw(Str[0]);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  Ch=loctoupper(Ch);
 | 
					 | 
				
			||||||
  for (int I=0;I<NumItems;I++)
 | 
					  for (int I=0;I<NumItems;I++)
 | 
				
			||||||
    if (Ch==Item[I][ItemKeyPos[I]])
 | 
					    if (Ch==Item[I][ItemKeyPos[I]])
 | 
				
			||||||
      return(I+1);
 | 
					      return I+1;
 | 
				
			||||||
  return(0);
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int KbdAnsi(char *Addr,size_t Size)
 | 
					static bool IsCommentUnsafe(const wchar *Data,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int RetCode=0;
 | 
					 | 
				
			||||||
#ifndef GUI
 | 
					 | 
				
			||||||
  for (size_t I=0;I<Size;I++)
 | 
					  for (size_t I=0;I<Size;I++)
 | 
				
			||||||
    if (Addr[I]==27 && Addr[I+1]=='[')
 | 
					    if (Data[I]==27 && Data[I+1]=='[')
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      for (size_t J=I+2;J<Size;J++)
 | 
					      for (size_t J=I+2;J<Size;J++)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        if (Addr[J]=='\"')
 | 
					        // Return true for <ESC>[{key};"{string}"p used to redefine
 | 
				
			||||||
          return(2);
 | 
					        // a keyboard key on some terminals.
 | 
				
			||||||
        if (!IsDigit(Addr[J]) && Addr[J]!=';')
 | 
					        if (Data[J]=='\"')
 | 
				
			||||||
 | 
					          return true;
 | 
				
			||||||
 | 
					        if (!IsDigit(Data[J]) && Data[J]!=';')
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      RetCode=1;
 | 
					  return false;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  return(RetCode);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void OutComment(char *Comment,size_t Size)
 | 
					void OutComment(const wchar *Comment,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef GUI
 | 
					  if (IsCommentUnsafe(Comment,Size))
 | 
				
			||||||
  if (KbdAnsi(Comment,Size)==2)
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  const size_t MaxOutSize=0x400;
 | 
					  const size_t MaxOutSize=0x400;
 | 
				
			||||||
  for (size_t I=0;I<Size;I+=MaxOutSize)
 | 
					  for (size_t I=0;I<Size;I+=MaxOutSize)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    char Msg[MaxOutSize+1];
 | 
					    wchar Msg[MaxOutSize+1];
 | 
				
			||||||
    size_t CopySize=Min(MaxOutSize,Size-I);
 | 
					    size_t CopySize=Min(MaxOutSize,Size-I);
 | 
				
			||||||
    strncpy(Msg,Comment+I,CopySize);
 | 
					    wcsncpy(Msg,Comment+I,CopySize);
 | 
				
			||||||
    Msg[CopySize]=0;
 | 
					    Msg[CopySize]=0;
 | 
				
			||||||
    mprintf("%s",Msg);
 | 
					    mprintf(L"%s",Msg);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  mprintf("\n");
 | 
					  mprintf(L"\n");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,46 +1,27 @@
 | 
				
			||||||
#ifndef _RAR_CONSIO_
 | 
					#ifndef _RAR_CONSIO_
 | 
				
			||||||
#define _RAR_CONSIO_
 | 
					#define _RAR_CONSIO_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(SILENT) && !defined(SFX_MODULE)
 | 
					void InitConsole();
 | 
				
			||||||
enum {SOUND_OK,SOUND_ALARM,SOUND_ERROR,SOUND_QUESTION};
 | 
					void SetConsoleMsgStream(MESSAGE_TYPE MsgStream);
 | 
				
			||||||
#endif
 | 
					void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset);
 | 
				
			||||||
 | 
					void OutComment(const wchar *Comment,size_t Size);
 | 
				
			||||||
enum PASSWORD_TYPE {PASSWORD_GLOBAL,PASSWORD_FILE,PASSWORD_ARCHIVE};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void InitConsoleOptions(MESSAGE_TYPE MsgStream,bool Sound);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SILENT
 | 
					#ifndef SILENT
 | 
				
			||||||
void mprintf(const char *fmt,...);
 | 
					bool GetConsolePassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *Password);
 | 
				
			||||||
void eprintf(const char *fmt,...);
 | 
					 | 
				
			||||||
void Alarm();
 | 
					 | 
				
			||||||
void GetPasswordText(char *Str,int MaxLength);
 | 
					 | 
				
			||||||
bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength);
 | 
					 | 
				
			||||||
int Ask(const char *AskStr);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void OutComment(char *Comment,size_t Size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef SILENT
 | 
					#ifdef SILENT
 | 
				
			||||||
#ifdef __GNUC__
 | 
					  inline void mprintf(const wchar *fmt,...) {}
 | 
				
			||||||
  #define mprintf(args...)
 | 
					  inline void eprintf(const wchar *fmt,...) {}
 | 
				
			||||||
  #define eprintf(args...)
 | 
					  inline void Alarm() {}
 | 
				
			||||||
 | 
					  inline int Ask(const wchar *AskStr) {return 0;}
 | 
				
			||||||
 | 
					  inline bool getwstr(wchar *str,size_t n) {return false;}
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #ifdef _MSC_VER
 | 
					  void mprintf(const wchar *fmt,...);
 | 
				
			||||||
    inline void mprintf(const char *fmt,...) {}
 | 
					  void eprintf(const wchar *fmt,...);
 | 
				
			||||||
  #else
 | 
					  void Alarm();
 | 
				
			||||||
    inline void mprintf(const char *fmt,const char *a=NULL,const char *b=NULL) {}
 | 
					  int Ask(const wchar *AskStr);
 | 
				
			||||||
  #endif
 | 
					  bool getwstr(wchar *str,size_t n);
 | 
				
			||||||
  inline void eprintf(const char *fmt,const char *a=NULL,const char *b=NULL) {}
 | 
					 | 
				
			||||||
  inline void mprintf(const char *fmt,int b) {}
 | 
					 | 
				
			||||||
  inline void eprintf(const char *fmt,int b) {}
 | 
					 | 
				
			||||||
  inline void mprintf(const char *fmt,const char *a,int b) {}
 | 
					 | 
				
			||||||
  inline void eprintf(const char *fmt,const char *a,int b) {}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
inline void Alarm() {}
 | 
					 | 
				
			||||||
inline void GetPasswordText(char *Str,int MaxLength) {}
 | 
					 | 
				
			||||||
inline unsigned int GetKey() {return(0);}
 | 
					 | 
				
			||||||
inline bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength) {return(false);}
 | 
					 | 
				
			||||||
inline int Ask(const char *AskStr) {return(0);}
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										111
									
								
								libunrar/crc.cpp
								
								
								
								
							
							
						
						
									
										111
									
								
								libunrar/crc.cpp
								
								
								
								
							| 
						 | 
					@ -1,56 +1,93 @@
 | 
				
			||||||
 | 
					// This CRC function is based on Intel Slicing-by-8 algorithm.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Original Intel Slicing-by-8 code is available here:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    http://sourceforge.net/projects/slicing-by-8/
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Original Intel Slicing-by-8 code is licensed as:
 | 
				
			||||||
 | 
					//    
 | 
				
			||||||
 | 
					//    Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
 | 
				
			||||||
 | 
					//    
 | 
				
			||||||
 | 
					//    This software program is licensed subject to the BSD License, 
 | 
				
			||||||
 | 
					//    available at http://www.opensource.org/licenses/bsd-license.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint CRCTab[256];
 | 
					static uint crc_tables[8][256]; // Tables for Slicing-by-8.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void InitCRC()
 | 
					
 | 
				
			||||||
 | 
					// Build the classic CRC32 lookup table.
 | 
				
			||||||
 | 
					// We also provide this function to legacy RAR and ZIP decryption code.
 | 
				
			||||||
 | 
					void InitCRC32(uint *CRCTab)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  for (int I=0;I<256;I++)
 | 
					  if (CRCTab[1]!=0)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  for (uint I=0;I<256;I++)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    uint C=I;
 | 
					    uint C=I;
 | 
				
			||||||
    for (int J=0;J<8;J++)
 | 
					    for (uint J=0;J<8;J++)
 | 
				
			||||||
      C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1);
 | 
					      C=(C & 1) ? (C>>1)^0xEDB88320 : (C>>1);
 | 
				
			||||||
    CRCTab[I]=C;
 | 
					    CRCTab[I]=C;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint CRC(uint StartCRC,const void *Addr,size_t Size)
 | 
					static void InitTables()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (CRCTab[1]==0)
 | 
					  InitCRC32(crc_tables[0]);
 | 
				
			||||||
    InitCRC();
 | 
					 | 
				
			||||||
  byte *Data=(byte *)Addr;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(LITTLE_ENDIAN) && defined(PRESENT_INT32) && defined(ALLOW_NOT_ALIGNED_INT)
 | 
					  for (uint I=0;I<256;I++) // Build additional lookup tables.
 | 
				
			||||||
  while (Size>0 && ((long)Data & 7))
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    StartCRC=CRCTab[(byte)(StartCRC^Data[0])]^(StartCRC>>8);
 | 
					    uint C=crc_tables[0][I];
 | 
				
			||||||
    Size--;
 | 
					    for (uint J=1;J<8;J++)
 | 
				
			||||||
    Data++;
 | 
					    {
 | 
				
			||||||
 | 
					      C=crc_tables[0][(byte)C]^(C>>8);
 | 
				
			||||||
 | 
					      crc_tables[J][I]=C;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  while (Size>=8)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    StartCRC^=*(uint32 *)Data;
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    StartCRC^=*(uint32 *)(Data+4);
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
 | 
					 | 
				
			||||||
    Data+=8;
 | 
					 | 
				
			||||||
    Size-=8;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (size_t I=0;I<Size;I++)
 | 
					 | 
				
			||||||
    StartCRC=CRCTab[(byte)(StartCRC^Data[I])]^(StartCRC>>8);
 | 
					 | 
				
			||||||
  return(StartCRC);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct CallInitCRC {CallInitCRC() {InitTables();}} static CallInit32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint CRC32(uint StartCRC,const void *Addr,size_t Size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  byte *Data=(byte *)Addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Align Data to 8 for better performance.
 | 
				
			||||||
 | 
					  for (;Size>0 && ((size_t)Data & 7);Size--,Data++)
 | 
				
			||||||
 | 
					    StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (;Size>=8;Size-=8,Data+=8)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					#ifdef BIG_ENDIAN
 | 
				
			||||||
 | 
					    StartCRC ^= Data[0]|(Data[1] << 8)|(Data[2] << 16)|(Data[3] << 24);
 | 
				
			||||||
 | 
					    uint NextData = Data[4]|(Data[5] << 8)|(Data[6] << 16)|(Data[7] << 24);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    StartCRC ^= *(uint32 *) Data;
 | 
				
			||||||
 | 
					    uint NextData = *(uint32 *) (Data+4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    StartCRC = crc_tables[7][(byte) StartCRC       ] ^
 | 
				
			||||||
 | 
					               crc_tables[6][(byte)(StartCRC >> 8) ] ^
 | 
				
			||||||
 | 
					               crc_tables[5][(byte)(StartCRC >> 16)] ^
 | 
				
			||||||
 | 
					               crc_tables[4][(byte)(StartCRC >> 24)] ^
 | 
				
			||||||
 | 
					               crc_tables[3][(byte) NextData       ] ^
 | 
				
			||||||
 | 
					               crc_tables[2][(byte)(NextData >> 8) ] ^
 | 
				
			||||||
 | 
					               crc_tables[1][(byte)(NextData >> 16)] ^
 | 
				
			||||||
 | 
					               crc_tables[0][(byte)(NextData >> 24)];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (;Size>0;Size--,Data++) // Process left data.
 | 
				
			||||||
 | 
					    StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return StartCRC;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
ushort OldCRC(ushort StartCRC,const void *Addr,size_t Size)
 | 
					// For RAR 1.4 archives in case somebody still has them.
 | 
				
			||||||
 | 
					ushort Checksum14(ushort StartCRC,const void *Addr,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  byte *Data=(byte *)Addr;
 | 
					  byte *Data=(byte *)Addr;
 | 
				
			||||||
  for (size_t I=0;I<Size;I++)
 | 
					  for (size_t I=0;I<Size;I++)
 | 
				
			||||||
| 
						 | 
					@ -58,6 +95,8 @@ ushort OldCRC(ushort StartCRC,const void *Addr,size_t Size)
 | 
				
			||||||
    StartCRC=(StartCRC+Data[I])&0xffff;
 | 
					    StartCRC=(StartCRC+Data[I])&0xffff;
 | 
				
			||||||
    StartCRC=((StartCRC<<1)|(StartCRC>>15))&0xffff;
 | 
					    StartCRC=((StartCRC<<1)|(StartCRC>>15))&0xffff;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(StartCRC);
 | 
					  return StartCRC;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,15 @@
 | 
				
			||||||
#ifndef _RAR_CRC_
 | 
					#ifndef _RAR_CRC_
 | 
				
			||||||
#define _RAR_CRC_
 | 
					#define _RAR_CRC_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern uint CRCTab[256];
 | 
					// This function is only to intialize external CRC tables. We do not need to
 | 
				
			||||||
 | 
					// call it before calculating CRC32.
 | 
				
			||||||
 | 
					void InitCRC32(uint *CRCTab);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint CRC32(uint StartCRC,const void *Addr,size_t Size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					ushort Checksum14(ushort StartCRC,const void *Addr,size_t Size);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void InitCRC();
 | 
					 | 
				
			||||||
uint CRC(uint StartCRC,const void *Addr,size_t Size);
 | 
					 | 
				
			||||||
ushort OldCRC(ushort StartCRC,const void *Addr,size_t Size);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,381 +1,134 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
extern uint CRCTab[256];
 | 
					#include "crypt1.cpp"
 | 
				
			||||||
 | 
					#include "crypt2.cpp"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#include "crypt3.cpp"
 | 
				
			||||||
#define NROUNDS 32
 | 
					#include "crypt5.cpp"
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define  rol(x,n,xsize)  (((x)<<(n)) | ((x)>>(xsize-(n))))
 | 
					 | 
				
			||||||
#define  ror(x,n,xsize)  (((x)>>(n)) | ((x)<<(xsize-(n))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define substLong(t) ( (uint)SubstTable[(uint)t&255] | \
 | 
					 | 
				
			||||||
           ((uint)SubstTable[(int)(t>> 8)&255]<< 8) | \
 | 
					 | 
				
			||||||
           ((uint)SubstTable[(int)(t>>16)&255]<<16) | \
 | 
					 | 
				
			||||||
           ((uint)SubstTable[(int)(t>>24)&255]<<24) )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CryptKeyCacheItem CryptData::Cache[4];
 | 
					 | 
				
			||||||
int CryptData::CachePos=0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					CryptData::CryptData()
 | 
				
			||||||
static byte InitSubstTable[256]={
 | 
					{
 | 
				
			||||||
  215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221,  2, 42,
 | 
					  Method=CRYPT_NONE;
 | 
				
			||||||
  232,  1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137,
 | 
					  memset(KDF3Cache,0,sizeof(KDF3Cache));
 | 
				
			||||||
  255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86,  6,
 | 
					  memset(KDF5Cache,0,sizeof(KDF5Cache));
 | 
				
			||||||
   71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235,
 | 
					  KDF3CachePos=0;
 | 
				
			||||||
  107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36,
 | 
					  KDF5CachePos=0;
 | 
				
			||||||
  158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251,
 | 
					  memset(CRCTab,0,sizeof(CRCTab));
 | 
				
			||||||
   97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11,
 | 
					}
 | 
				
			||||||
  164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51,
 | 
					
 | 
				
			||||||
  207,120,189,210,  8,226, 41, 72,183,203,135,165,166, 60, 98,  7,
 | 
					
 | 
				
			||||||
  122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80,
 | 
					CryptData::~CryptData()
 | 
				
			||||||
  131,  3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129,
 | 
					{
 | 
				
			||||||
  224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10,
 | 
					  cleandata(KDF3Cache,sizeof(KDF3Cache));
 | 
				
			||||||
  118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45,  4,148,108,
 | 
					  cleandata(KDF5Cache,sizeof(KDF5Cache));
 | 
				
			||||||
  161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225,
 | 
					}
 | 
				
			||||||
    0, 46,169,186, 68, 95,237, 65, 53,208,253,168,  9, 18,100, 52,
 | 
					
 | 
				
			||||||
  116,184,160, 96,109, 37, 30,106,140,104,150,  5,204,117,112, 84
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CryptData::DecryptBlock(byte *Buf,size_t Size)
 | 
					void CryptData::DecryptBlock(byte *Buf,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  rin.blockDecrypt(Buf,Size,Buf);
 | 
					  switch(Method)
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
void CryptData::EncryptBlock20(byte *Buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  uint A,B,C,D,T,TA,TB;
 | 
					 | 
				
			||||||
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
 | 
					 | 
				
			||||||
  A=((uint)Buf[0]|((uint)Buf[1]<<8)|((uint)Buf[2]<<16)|((uint)Buf[3]<<24))^Key[0];
 | 
					 | 
				
			||||||
  B=((uint)Buf[4]|((uint)Buf[5]<<8)|((uint)Buf[6]<<16)|((uint)Buf[7]<<24))^Key[1];
 | 
					 | 
				
			||||||
  C=((uint)Buf[8]|((uint)Buf[9]<<8)|((uint)Buf[10]<<16)|((uint)Buf[11]<<24))^Key[2];
 | 
					 | 
				
			||||||
  D=((uint)Buf[12]|((uint)Buf[13]<<8)|((uint)Buf[14]<<16)|((uint)Buf[15]<<24))^Key[3];
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  uint32 *BufPtr=(uint32 *)Buf;
 | 
					 | 
				
			||||||
  A=BufPtr[0]^Key[0];
 | 
					 | 
				
			||||||
  B=BufPtr[1]^Key[1];
 | 
					 | 
				
			||||||
  C=BufPtr[2]^Key[2];
 | 
					 | 
				
			||||||
  D=BufPtr[3]^Key[3];
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  for(int I=0;I<NROUNDS;I++)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    T=((C+rol(D,11,32))^Key[I&3]);
 | 
					 | 
				
			||||||
    TA=A^substLong(T);
 | 
					 | 
				
			||||||
    T=((D^rol(C,17,32))+Key[I&3]);
 | 
					 | 
				
			||||||
    TB=B^substLong(T);
 | 
					 | 
				
			||||||
    A=C;
 | 
					 | 
				
			||||||
    B=D;
 | 
					 | 
				
			||||||
    C=TA;
 | 
					 | 
				
			||||||
    D=TB;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
 | 
					 | 
				
			||||||
  C^=Key[0];
 | 
					 | 
				
			||||||
  Buf[0]=(byte)C;
 | 
					 | 
				
			||||||
  Buf[1]=(byte)(C>>8);
 | 
					 | 
				
			||||||
  Buf[2]=(byte)(C>>16);
 | 
					 | 
				
			||||||
  Buf[3]=(byte)(C>>24);
 | 
					 | 
				
			||||||
  D^=Key[1];
 | 
					 | 
				
			||||||
  Buf[4]=(byte)D;
 | 
					 | 
				
			||||||
  Buf[5]=(byte)(D>>8);
 | 
					 | 
				
			||||||
  Buf[6]=(byte)(D>>16);
 | 
					 | 
				
			||||||
  Buf[7]=(byte)(D>>24);
 | 
					 | 
				
			||||||
  A^=Key[2];
 | 
					 | 
				
			||||||
  Buf[8]=(byte)A;
 | 
					 | 
				
			||||||
  Buf[9]=(byte)(A>>8);
 | 
					 | 
				
			||||||
  Buf[10]=(byte)(A>>16);
 | 
					 | 
				
			||||||
  Buf[11]=(byte)(A>>24);
 | 
					 | 
				
			||||||
  B^=Key[3];
 | 
					 | 
				
			||||||
  Buf[12]=(byte)B;
 | 
					 | 
				
			||||||
  Buf[13]=(byte)(B>>8);
 | 
					 | 
				
			||||||
  Buf[14]=(byte)(B>>16);
 | 
					 | 
				
			||||||
  Buf[15]=(byte)(B>>24);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  BufPtr[0]=C^Key[0];
 | 
					 | 
				
			||||||
  BufPtr[1]=D^Key[1];
 | 
					 | 
				
			||||||
  BufPtr[2]=A^Key[2];
 | 
					 | 
				
			||||||
  BufPtr[3]=B^Key[3];
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  UpdKeys(Buf);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::DecryptBlock20(byte *Buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  byte InBuf[16];
 | 
					 | 
				
			||||||
  uint A,B,C,D,T,TA,TB;
 | 
					 | 
				
			||||||
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
 | 
					 | 
				
			||||||
  A=((uint)Buf[0]|((uint)Buf[1]<<8)|((uint)Buf[2]<<16)|((uint)Buf[3]<<24))^Key[0];
 | 
					 | 
				
			||||||
  B=((uint)Buf[4]|((uint)Buf[5]<<8)|((uint)Buf[6]<<16)|((uint)Buf[7]<<24))^Key[1];
 | 
					 | 
				
			||||||
  C=((uint)Buf[8]|((uint)Buf[9]<<8)|((uint)Buf[10]<<16)|((uint)Buf[11]<<24))^Key[2];
 | 
					 | 
				
			||||||
  D=((uint)Buf[12]|((uint)Buf[13]<<8)|((uint)Buf[14]<<16)|((uint)Buf[15]<<24))^Key[3];
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  uint32 *BufPtr=(uint32 *)Buf;
 | 
					 | 
				
			||||||
  A=BufPtr[0]^Key[0];
 | 
					 | 
				
			||||||
  B=BufPtr[1]^Key[1];
 | 
					 | 
				
			||||||
  C=BufPtr[2]^Key[2];
 | 
					 | 
				
			||||||
  D=BufPtr[3]^Key[3];
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  memcpy(InBuf,Buf,sizeof(InBuf));
 | 
					 | 
				
			||||||
  for(int I=NROUNDS-1;I>=0;I--)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    T=((C+rol(D,11,32))^Key[I&3]);
 | 
					 | 
				
			||||||
    TA=A^substLong(T);
 | 
					 | 
				
			||||||
    T=((D^rol(C,17,32))+Key[I&3]);
 | 
					 | 
				
			||||||
    TB=B^substLong(T);
 | 
					 | 
				
			||||||
    A=C;
 | 
					 | 
				
			||||||
    B=D;
 | 
					 | 
				
			||||||
    C=TA;
 | 
					 | 
				
			||||||
    D=TB;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
 | 
					 | 
				
			||||||
  C^=Key[0];
 | 
					 | 
				
			||||||
  Buf[0]=(byte)C;
 | 
					 | 
				
			||||||
  Buf[1]=(byte)(C>>8);
 | 
					 | 
				
			||||||
  Buf[2]=(byte)(C>>16);
 | 
					 | 
				
			||||||
  Buf[3]=(byte)(C>>24);
 | 
					 | 
				
			||||||
  D^=Key[1];
 | 
					 | 
				
			||||||
  Buf[4]=(byte)D;
 | 
					 | 
				
			||||||
  Buf[5]=(byte)(D>>8);
 | 
					 | 
				
			||||||
  Buf[6]=(byte)(D>>16);
 | 
					 | 
				
			||||||
  Buf[7]=(byte)(D>>24);
 | 
					 | 
				
			||||||
  A^=Key[2];
 | 
					 | 
				
			||||||
  Buf[8]=(byte)A;
 | 
					 | 
				
			||||||
  Buf[9]=(byte)(A>>8);
 | 
					 | 
				
			||||||
  Buf[10]=(byte)(A>>16);
 | 
					 | 
				
			||||||
  Buf[11]=(byte)(A>>24);
 | 
					 | 
				
			||||||
  B^=Key[3];
 | 
					 | 
				
			||||||
  Buf[12]=(byte)B;
 | 
					 | 
				
			||||||
  Buf[13]=(byte)(B>>8);
 | 
					 | 
				
			||||||
  Buf[14]=(byte)(B>>16);
 | 
					 | 
				
			||||||
  Buf[15]=(byte)(B>>24);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  BufPtr[0]=C^Key[0];
 | 
					 | 
				
			||||||
  BufPtr[1]=D^Key[1];
 | 
					 | 
				
			||||||
  BufPtr[2]=A^Key[2];
 | 
					 | 
				
			||||||
  BufPtr[3]=B^Key[3];
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  UpdKeys(InBuf);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::UpdKeys(byte *Buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  for (int I=0;I<16;I+=4)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Key[0]^=CRCTab[Buf[I]];
 | 
					 | 
				
			||||||
    Key[1]^=CRCTab[Buf[I+1]];
 | 
					 | 
				
			||||||
    Key[2]^=CRCTab[Buf[I+2]];
 | 
					 | 
				
			||||||
    Key[3]^=CRCTab[Buf[I+3]];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::Swap(byte *Ch1,byte *Ch2)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  byte Ch=*Ch1;
 | 
					 | 
				
			||||||
  *Ch1=*Ch2;
 | 
					 | 
				
			||||||
  *Ch2=Ch;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::SetCryptKeys(const char *Password,const byte *Salt,bool Encrypt,bool OldOnly,bool HandsOffHash)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (*Password==0)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  if (OldOnly)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
    if (CRCTab[1]==0)
 | 
					    case CRYPT_RAR13:
 | 
				
			||||||
      InitCRC();
 | 
					      Decrypt13(Buf,Size);
 | 
				
			||||||
    byte Psw[MAXPASSWORD];
 | 
					      break;
 | 
				
			||||||
    SetOldKeys(Password);
 | 
					    case CRYPT_RAR15:
 | 
				
			||||||
    Key[0]=0xD3A3B879L;
 | 
					      Crypt15(Buf,Size);
 | 
				
			||||||
    Key[1]=0x3F6D12F7L;
 | 
					      break;
 | 
				
			||||||
    Key[2]=0x7515A235L;
 | 
					    case CRYPT_RAR20:
 | 
				
			||||||
    Key[3]=0xA4E7F123L;
 | 
					      for (size_t I=0;I<Size;I+=CRYPT_BLOCK_SIZE)
 | 
				
			||||||
    memset(Psw,0,sizeof(Psw));
 | 
					        DecryptBlock20(Buf+I);
 | 
				
			||||||
#if defined(_WIN_32) && !defined(GUI)
 | 
					 | 
				
			||||||
    CharToOemBuff(Password,(char*)Psw,(DWORD)strlen(Password));
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    strncpyz((char *)Psw,Password,ASIZE(Psw));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    size_t PswLength=strlen(Password);
 | 
					 | 
				
			||||||
    memcpy(SubstTable,InitSubstTable,sizeof(SubstTable));
 | 
					 | 
				
			||||||
    for (int J=0;J<256;J++)
 | 
					 | 
				
			||||||
      for (size_t I=0;I<PswLength;I+=2)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        uint N1=(byte)CRCTab[(Psw[I]-J)&0xff];
 | 
					 | 
				
			||||||
        uint N2=(byte)CRCTab[(Psw[I+1]+J)&0xff];
 | 
					 | 
				
			||||||
        for (int K=1;N1!=N2;N1=(N1+1)&0xff,K++)
 | 
					 | 
				
			||||||
          Swap(&SubstTable[N1],&SubstTable[(N1+I+K)&0xff]);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    for (size_t I=0;I<PswLength;I+=16)
 | 
					 | 
				
			||||||
      EncryptBlock20(&Psw[I]);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool Cached=false;
 | 
					 | 
				
			||||||
  for (int I=0;I<ASIZE(Cache);I++)
 | 
					 | 
				
			||||||
    if (strcmp(Cache[I].Password,Password)==0 &&
 | 
					 | 
				
			||||||
        (Salt==NULL && !Cache[I].SaltPresent || Salt!=NULL &&
 | 
					 | 
				
			||||||
        Cache[I].SaltPresent && memcmp(Cache[I].Salt,Salt,SALT_SIZE)==0) &&
 | 
					 | 
				
			||||||
        Cache[I].HandsOffHash==HandsOffHash)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      memcpy(AESKey,Cache[I].AESKey,sizeof(AESKey));
 | 
					 | 
				
			||||||
      memcpy(AESInit,Cache[I].AESInit,sizeof(AESInit));
 | 
					 | 
				
			||||||
      Cached=true;
 | 
					 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!Cached)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    wchar PswW[MAXPASSWORD];
 | 
					 | 
				
			||||||
    CharToWide(Password,PswW,MAXPASSWORD-1);
 | 
					 | 
				
			||||||
    PswW[MAXPASSWORD-1]=0;
 | 
					 | 
				
			||||||
    byte RawPsw[2*MAXPASSWORD+SALT_SIZE];
 | 
					 | 
				
			||||||
    WideToRaw(PswW,RawPsw);
 | 
					 | 
				
			||||||
    size_t RawLength=2*strlenw(PswW);
 | 
					 | 
				
			||||||
    if (Salt!=NULL)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      memcpy(RawPsw+RawLength,Salt,SALT_SIZE);
 | 
					 | 
				
			||||||
      RawLength+=SALT_SIZE;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    hash_context c;
 | 
					 | 
				
			||||||
    hash_initial(&c);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const int HashRounds=0x40000;
 | 
					 | 
				
			||||||
    for (int I=0;I<HashRounds;I++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      hash_process( &c, RawPsw, RawLength, HandsOffHash);
 | 
					 | 
				
			||||||
      byte PswNum[3];
 | 
					 | 
				
			||||||
      PswNum[0]=(byte)I;
 | 
					 | 
				
			||||||
      PswNum[1]=(byte)(I>>8);
 | 
					 | 
				
			||||||
      PswNum[2]=(byte)(I>>16);
 | 
					 | 
				
			||||||
      hash_process( &c, PswNum, 3, HandsOffHash);
 | 
					 | 
				
			||||||
      if (I%(HashRounds/16)==0)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        hash_context tempc=c;
 | 
					 | 
				
			||||||
        uint32 digest[5];
 | 
					 | 
				
			||||||
        hash_final( &tempc, digest, HandsOffHash);
 | 
					 | 
				
			||||||
        AESInit[I/(HashRounds/16)]=(byte)digest[4];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    uint32 digest[5];
 | 
					 | 
				
			||||||
    hash_final( &c, digest, HandsOffHash);
 | 
					 | 
				
			||||||
    for (int I=0;I<4;I++)
 | 
					 | 
				
			||||||
      for (int J=0;J<4;J++)
 | 
					 | 
				
			||||||
        AESKey[I*4+J]=(byte)(digest[I]>>(J*8));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    strcpy(Cache[CachePos].Password,Password);
 | 
					 | 
				
			||||||
    if ((Cache[CachePos].SaltPresent=(Salt!=NULL))==true)
 | 
					 | 
				
			||||||
      memcpy(Cache[CachePos].Salt,Salt,SALT_SIZE);
 | 
					 | 
				
			||||||
    Cache[CachePos].HandsOffHash=HandsOffHash;
 | 
					 | 
				
			||||||
    memcpy(Cache[CachePos].AESKey,AESKey,sizeof(AESKey));
 | 
					 | 
				
			||||||
    memcpy(Cache[CachePos].AESInit,AESInit,sizeof(AESInit));
 | 
					 | 
				
			||||||
    CachePos=(CachePos+1)%(sizeof(Cache)/sizeof(Cache[0]));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  rin.init(Encrypt ? Rijndael::Encrypt : Rijndael::Decrypt,AESKey,AESInit);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
void CryptData::SetOldKeys(const char *Password)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  uint PswCRC=CRC(0xffffffff,Password,strlen(Password));
 | 
					 | 
				
			||||||
  OldKey[0]=PswCRC&0xffff;
 | 
					 | 
				
			||||||
  OldKey[1]=(PswCRC>>16)&0xffff;
 | 
					 | 
				
			||||||
  OldKey[2]=OldKey[3]=0;
 | 
					 | 
				
			||||||
  PN1=PN2=PN3=0;
 | 
					 | 
				
			||||||
  byte Ch;
 | 
					 | 
				
			||||||
  while ((Ch=*Password)!=0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    PN1+=Ch;
 | 
					 | 
				
			||||||
    PN2^=Ch;
 | 
					 | 
				
			||||||
    PN3+=Ch;
 | 
					 | 
				
			||||||
    PN3=(byte)rol(PN3,1,8);
 | 
					 | 
				
			||||||
    OldKey[2]^=Ch^CRCTab[Ch];
 | 
					 | 
				
			||||||
    OldKey[3]+=Ch+(CRCTab[Ch]>>16);
 | 
					 | 
				
			||||||
    Password++;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::SetAV15Encryption()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  OldKey[0]=0x4765;
 | 
					 | 
				
			||||||
  OldKey[1]=0x9021;
 | 
					 | 
				
			||||||
  OldKey[2]=0x7382;
 | 
					 | 
				
			||||||
  OldKey[3]=0x5215;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::SetCmt13Encryption()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  PN1=0;
 | 
					 | 
				
			||||||
  PN2=7;
 | 
					 | 
				
			||||||
  PN3=77;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::Crypt(byte *Data,uint Count,int Method)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (Method==OLD_DECODE)
 | 
					 | 
				
			||||||
    Decode13(Data,Count);
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    if (Method==OLD_ENCODE)
 | 
					 | 
				
			||||||
      Encode13(Data,Count);
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      Crypt15(Data,Count);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::Encode13(byte *Data,uint Count)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  while (Count--)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    PN2+=PN3;
 | 
					 | 
				
			||||||
    PN1+=PN2;
 | 
					 | 
				
			||||||
    *Data+=PN1;
 | 
					 | 
				
			||||||
    Data++;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::Decode13(byte *Data,uint Count)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  while (Count--)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    PN2+=PN3;
 | 
					 | 
				
			||||||
    PN1+=PN2;
 | 
					 | 
				
			||||||
    *Data-=PN1;
 | 
					 | 
				
			||||||
    Data++;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void CryptData::Crypt15(byte *Data,uint Count)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  while (Count--)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    OldKey[0]+=0x1234;
 | 
					 | 
				
			||||||
    OldKey[1]^=CRCTab[(OldKey[0] & 0x1fe)>>1];
 | 
					 | 
				
			||||||
    OldKey[2]-=CRCTab[(OldKey[0] & 0x1fe)>>1]>>16;
 | 
					 | 
				
			||||||
    OldKey[0]^=OldKey[2];
 | 
					 | 
				
			||||||
    OldKey[3]=ror(OldKey[3]&0xffff,1,16)^OldKey[1];
 | 
					 | 
				
			||||||
    OldKey[3]=ror(OldKey[3]&0xffff,1,16);
 | 
					 | 
				
			||||||
    OldKey[0]^=OldKey[3];
 | 
					 | 
				
			||||||
    *Data^=(byte)(OldKey[0]>>8);
 | 
					 | 
				
			||||||
    Data++;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					    case CRYPT_RAR30:
 | 
				
			||||||
 | 
					    case CRYPT_RAR50:
 | 
				
			||||||
 | 
					      rin.blockDecrypt(Buf,Size,Buf);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CryptData::SetCryptKeys(bool Encrypt,CRYPT_METHOD Method,
 | 
				
			||||||
 | 
					     SecPassword *Password,const byte *Salt,
 | 
				
			||||||
 | 
					     const byte *InitV,uint Lg2Cnt,byte *HashKey,byte *PswCheck)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!Password->IsSet() || Method==CRYPT_NONE)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CryptData::Method=Method;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wchar PwdW[MAXPASSWORD];
 | 
				
			||||||
 | 
					  Password->Get(PwdW,ASIZE(PwdW));
 | 
				
			||||||
 | 
					  char PwdA[MAXPASSWORD];
 | 
				
			||||||
 | 
					  WideToChar(PwdW,PwdA,ASIZE(PwdA));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  switch(Method)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					    case CRYPT_RAR13:
 | 
				
			||||||
 | 
					      SetKey13(PwdA);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case CRYPT_RAR15:
 | 
				
			||||||
 | 
					      SetKey15(PwdA);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case CRYPT_RAR20:
 | 
				
			||||||
 | 
					      SetKey20(PwdA);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    case CRYPT_RAR30:
 | 
				
			||||||
 | 
					      SetKey30(Encrypt,Password,PwdW,Salt);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case CRYPT_RAR50:
 | 
				
			||||||
 | 
					      SetKey50(Encrypt,Password,PwdW,Salt,InitV,Lg2Cnt,HashKey,PswCheck);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  cleandata(PwdA,sizeof(PwdA));
 | 
				
			||||||
 | 
					  cleandata(PwdW,sizeof(PwdW));
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Use the current system time to additionally randomize data.
 | 
				
			||||||
 | 
					static void TimeRandomize(byte *RndBuf,size_t BufSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  static uint Count=0;
 | 
				
			||||||
 | 
					  RarTime CurTime;
 | 
				
			||||||
 | 
					  CurTime.SetCurrentTime();
 | 
				
			||||||
 | 
					  uint64 Random=CurTime.GetWin()+clock();
 | 
				
			||||||
 | 
					  for (size_t I=0;I<BufSize;I++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    byte RndByte = byte (Random >> ( (I & 7) * 8 ));
 | 
				
			||||||
 | 
					    RndBuf[I]=byte( (RndByte ^ I) + Count++);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Fill buffer with random data.
 | 
				
			||||||
 | 
					void GetRnd(byte *RndBuf,size_t BufSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  bool Success=false;
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
 | 
					  HCRYPTPROV hProvider = 0;
 | 
				
			||||||
 | 
					  if (CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Success=CryptGenRandom(hProvider, (DWORD)BufSize, RndBuf) == TRUE;
 | 
				
			||||||
 | 
					    CryptReleaseContext(hProvider, 0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#elif defined(_UNIX)
 | 
				
			||||||
 | 
					  FILE *rndf = fopen("/dev/urandom", "r");
 | 
				
			||||||
 | 
					  if (rndf!=NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Success=fread(RndBuf, BufSize, 1, rndf) == BufSize;
 | 
				
			||||||
 | 
					    fclose(rndf);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  // We use this code only as the last resort if code above failed.
 | 
				
			||||||
 | 
					  if (!Success)
 | 
				
			||||||
 | 
					    TimeRandomize(RndBuf,BufSize);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,62 +1,101 @@
 | 
				
			||||||
#ifndef _RAR_CRYPT_
 | 
					#ifndef _RAR_CRYPT_
 | 
				
			||||||
#define _RAR_CRYPT_
 | 
					#define _RAR_CRYPT_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum { OLD_DECODE=0,OLD_ENCODE=1,NEW_CRYPT=2 };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum CRYPT_METHOD {
 | 
				
			||||||
struct CryptKeyCacheItem
 | 
					  CRYPT_NONE,CRYPT_RAR13,CRYPT_RAR15,CRYPT_RAR20,CRYPT_RAR30,CRYPT_RAR50
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifndef _SFX_RTL_
 | 
					 | 
				
			||||||
  CryptKeyCacheItem()
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    *Password=0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ~CryptKeyCacheItem()
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    memset(AESKey,0,sizeof(AESKey));
 | 
					 | 
				
			||||||
    memset(AESInit,0,sizeof(AESInit));
 | 
					 | 
				
			||||||
    memset(Password,0,sizeof(Password));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  byte AESKey[16],AESInit[16];
 | 
					 | 
				
			||||||
  char Password[MAXPASSWORD];
 | 
					 | 
				
			||||||
  bool SaltPresent;
 | 
					 | 
				
			||||||
  byte Salt[SALT_SIZE];
 | 
					 | 
				
			||||||
  bool HandsOffHash;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SIZE_SALT50              16
 | 
				
			||||||
 | 
					#define SIZE_SALT30               8
 | 
				
			||||||
 | 
					#define SIZE_INITV               16
 | 
				
			||||||
 | 
					#define SIZE_PSWCHECK             8
 | 
				
			||||||
 | 
					#define SIZE_PSWCHECK_CSUM        4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CRYPT_BLOCK_SIZE         16
 | 
				
			||||||
 | 
					#define CRYPT_BLOCK_MASK         (CRYPT_BLOCK_SIZE-1) // 0xf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CRYPT5_KDF_LG2_COUNT     15 // LOG2 of PDKDF2 iteration count.
 | 
				
			||||||
 | 
					#define CRYPT5_KDF_LG2_COUNT_MAX 24 // LOG2 of maximum accepted iteration count.
 | 
				
			||||||
 | 
					#define CRYPT_VERSION             0 // Supported encryption version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CryptData
 | 
					class CryptData
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  struct KDF5CacheItem
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    SecPassword Pwd;
 | 
				
			||||||
 | 
					    byte Salt[SIZE_SALT50];
 | 
				
			||||||
 | 
					    byte Key[32];
 | 
				
			||||||
 | 
					    uint Lg2Count; // Log2 of PBKDF2 repetition count.
 | 
				
			||||||
 | 
					    byte PswCheckValue[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					    byte HashKeyValue[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  struct KDF3CacheItem
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    SecPassword Pwd;
 | 
				
			||||||
 | 
					    byte Salt[SIZE_SALT30];
 | 
				
			||||||
 | 
					    byte Key[16];
 | 
				
			||||||
 | 
					    byte Init[16];
 | 
				
			||||||
 | 
					    bool SaltPresent;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    void Encode13(byte *Data,uint Count);
 | 
					    void SetKey13(const char *Password);
 | 
				
			||||||
    void Decode13(byte *Data,uint Count);
 | 
					    void Decrypt13(byte *Data,size_t Count);
 | 
				
			||||||
    void Crypt15(byte *Data,uint Count);
 | 
					
 | 
				
			||||||
    void UpdKeys(byte *Buf);
 | 
					    void SetKey15(const char *Password);
 | 
				
			||||||
    void Swap(byte *Ch1,byte *Ch2);
 | 
					    void Crypt15(byte *Data,size_t Count);
 | 
				
			||||||
    void SetOldKeys(const char *Password);
 | 
					
 | 
				
			||||||
 | 
					    void SetKey20(const char *Password);
 | 
				
			||||||
 | 
					    void Swap20(byte *Ch1,byte *Ch2);
 | 
				
			||||||
 | 
					    void UpdKeys20(byte *Buf);
 | 
				
			||||||
 | 
					    void EncryptBlock20(byte *Buf);
 | 
				
			||||||
 | 
					    void DecryptBlock20(byte *Buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void SetKey30(bool Encrypt,SecPassword *Password,const wchar *PwdW,const byte *Salt);
 | 
				
			||||||
 | 
					    void SetKey50(bool Encrypt,SecPassword *Password,const wchar *PwdW,const byte *Salt,const byte *InitV,uint Lg2Cnt,byte *HashKey,byte *PswCheck);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KDF3CacheItem KDF3Cache[4];
 | 
				
			||||||
 | 
					    uint KDF3CachePos;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    KDF5CacheItem KDF5Cache[4];
 | 
				
			||||||
 | 
					    uint KDF5CachePos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CRYPT_METHOD Method;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Rijndael rin;
 | 
					    Rijndael rin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    byte SubstTable[256];
 | 
					    uint CRCTab[256]; // For RAR 1.5 and RAR 2.0 encryption.
 | 
				
			||||||
    uint Key[4];
 | 
					 | 
				
			||||||
    ushort OldKey[4];
 | 
					 | 
				
			||||||
    byte PN1,PN2,PN3;
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    byte AESKey[16],AESInit[16];
 | 
					    byte SubstTable20[256];
 | 
				
			||||||
 | 
					    uint Key20[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static CryptKeyCacheItem Cache[4];
 | 
					    byte Key13[3];
 | 
				
			||||||
    static int CachePos;
 | 
					    ushort Key15[4];
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    void SetCryptKeys(const char *Password,const byte *Salt,bool Encrypt,bool OldOnly,bool HandsOffHash);
 | 
					    CryptData();
 | 
				
			||||||
 | 
					    ~CryptData();
 | 
				
			||||||
 | 
					    bool SetCryptKeys(bool Encrypt,CRYPT_METHOD Method,SecPassword *Password,
 | 
				
			||||||
 | 
					         const byte *Salt,const byte *InitV,uint Lg2Cnt,
 | 
				
			||||||
 | 
					         byte *HashKey,byte *PswCheck);
 | 
				
			||||||
    void SetAV15Encryption();
 | 
					    void SetAV15Encryption();
 | 
				
			||||||
    void SetCmt13Encryption();
 | 
					    void SetCmt13Encryption();
 | 
				
			||||||
    void EncryptBlock20(byte *Buf);
 | 
					 | 
				
			||||||
    void DecryptBlock20(byte *Buf);
 | 
					 | 
				
			||||||
    void EncryptBlock(byte *Buf,size_t Size);
 | 
					    void EncryptBlock(byte *Buf,size_t Size);
 | 
				
			||||||
    void DecryptBlock(byte *Buf,size_t Size);
 | 
					    void DecryptBlock(byte *Buf,size_t Size);
 | 
				
			||||||
    void Crypt(byte *Data,uint Count,int Method);
 | 
					    static void SetSalt(byte *Salt,size_t SaltSize);
 | 
				
			||||||
    static void SetSalt(byte *Salt,int SaltSize);
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GetRnd(byte *RndBuf,size_t BufSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hmac_sha256(const byte *Key,size_t KeyLength,const byte *Data,
 | 
				
			||||||
 | 
					                 size_t DataLength,byte *ResDigest);
 | 
				
			||||||
 | 
					void pbkdf2(const byte *pass, size_t pass_len, const byte *salt,
 | 
				
			||||||
 | 
					            size_t salt_len,byte *key, byte *Value1, byte *Value2,
 | 
				
			||||||
 | 
					            uint rounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ConvertHashToMAC(HashValue *Value,byte *Key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,79 @@
 | 
				
			||||||
 | 
					extern uint CRCTab[256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::SetKey13(const char *Password)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  Key13[0]=Key13[1]=Key13[2]=0;
 | 
				
			||||||
 | 
					  for (size_t I=0;Password[I]!=0;I++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    byte P=Password[I];
 | 
				
			||||||
 | 
					    Key13[0]+=P;
 | 
				
			||||||
 | 
					    Key13[1]^=P;
 | 
				
			||||||
 | 
					    Key13[2]+=P;
 | 
				
			||||||
 | 
					    Key13[2]=(byte)rotls(Key13[2],1,8);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::SetKey15(const char *Password)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  InitCRC32(CRCTab);
 | 
				
			||||||
 | 
					  uint PswCRC=CRC32(0xffffffff,Password,strlen(Password));
 | 
				
			||||||
 | 
					  Key15[0]=PswCRC&0xffff;
 | 
				
			||||||
 | 
					  Key15[1]=(PswCRC>>16)&0xffff;
 | 
				
			||||||
 | 
					  Key15[2]=Key15[3]=0;
 | 
				
			||||||
 | 
					  for (size_t I=0;Password[I]!=0;I++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    byte P=Password[I];
 | 
				
			||||||
 | 
					    Key15[2]^=P^CRCTab[P];
 | 
				
			||||||
 | 
					    Key15[3]+=P+(CRCTab[P]>>16);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::SetAV15Encryption()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  InitCRC32(CRCTab);
 | 
				
			||||||
 | 
					  Method=CRYPT_RAR15;
 | 
				
			||||||
 | 
					  Key15[0]=0x4765;
 | 
				
			||||||
 | 
					  Key15[1]=0x9021;
 | 
				
			||||||
 | 
					  Key15[2]=0x7382;
 | 
				
			||||||
 | 
					  Key15[3]=0x5215;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::SetCmt13Encryption()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  Method=CRYPT_RAR13;
 | 
				
			||||||
 | 
					  Key13[0]=0;
 | 
				
			||||||
 | 
					  Key13[1]=7;
 | 
				
			||||||
 | 
					  Key13[2]=77;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::Decrypt13(byte *Data,size_t Count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  while (Count--)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Key13[1]+=Key13[2];
 | 
				
			||||||
 | 
					    Key13[0]+=Key13[1];
 | 
				
			||||||
 | 
					    *Data-=Key13[0];
 | 
				
			||||||
 | 
					    Data++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::Crypt15(byte *Data,size_t Count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  while (Count--)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Key15[0]+=0x1234;
 | 
				
			||||||
 | 
					    Key15[1]^=CRCTab[(Key15[0] & 0x1fe)>>1];
 | 
				
			||||||
 | 
					    Key15[2]-=CRCTab[(Key15[0] & 0x1fe)>>1]>>16;
 | 
				
			||||||
 | 
					    Key15[0]^=Key15[2];
 | 
				
			||||||
 | 
					    Key15[3]=rotrs(Key15[3]&0xffff,1,16)^Key15[1];
 | 
				
			||||||
 | 
					    Key15[3]=rotrs(Key15[3]&0xffff,1,16);
 | 
				
			||||||
 | 
					    Key15[0]^=Key15[3];
 | 
				
			||||||
 | 
					    *Data^=(byte)(Key15[0]>>8);
 | 
				
			||||||
 | 
					    Data++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,133 @@
 | 
				
			||||||
 | 
					#define NROUNDS 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define substLong(t) ( (uint)SubstTable20[(uint)t&255] | \
 | 
				
			||||||
 | 
					           ((uint)SubstTable20[(int)(t>> 8)&255]<< 8) | \
 | 
				
			||||||
 | 
					           ((uint)SubstTable20[(int)(t>>16)&255]<<16) | \
 | 
				
			||||||
 | 
					           ((uint)SubstTable20[(int)(t>>24)&255]<<24) )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static byte InitSubstTable20[256]={
 | 
				
			||||||
 | 
					  215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221,  2, 42,
 | 
				
			||||||
 | 
					  232,  1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137,
 | 
				
			||||||
 | 
					  255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86,  6,
 | 
				
			||||||
 | 
					   71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235,
 | 
				
			||||||
 | 
					  107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36,
 | 
				
			||||||
 | 
					  158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251,
 | 
				
			||||||
 | 
					   97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11,
 | 
				
			||||||
 | 
					  164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51,
 | 
				
			||||||
 | 
					  207,120,189,210,  8,226, 41, 72,183,203,135,165,166, 60, 98,  7,
 | 
				
			||||||
 | 
					  122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80,
 | 
				
			||||||
 | 
					  131,  3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129,
 | 
				
			||||||
 | 
					  224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10,
 | 
				
			||||||
 | 
					  118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45,  4,148,108,
 | 
				
			||||||
 | 
					  161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225,
 | 
				
			||||||
 | 
					    0, 46,169,186, 68, 95,237, 65, 53,208,253,168,  9, 18,100, 52,
 | 
				
			||||||
 | 
					  116,184,160, 96,109, 37, 30,106,140,104,150,  5,204,117,112, 84
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::SetKey20(const char *Password)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  InitCRC32(CRCTab);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char Psw[MAXPASSWORD];
 | 
				
			||||||
 | 
					  strncpyz(Psw,Password,ASIZE(Psw)); // We'll need to modify it below.
 | 
				
			||||||
 | 
					  size_t PswLength=strlen(Psw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Key20[0]=0xD3A3B879L;
 | 
				
			||||||
 | 
					  Key20[1]=0x3F6D12F7L;
 | 
				
			||||||
 | 
					  Key20[2]=0x7515A235L;
 | 
				
			||||||
 | 
					  Key20[3]=0xA4E7F123L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  memcpy(SubstTable20,InitSubstTable20,sizeof(SubstTable20));
 | 
				
			||||||
 | 
					  for (uint J=0;J<256;J++)
 | 
				
			||||||
 | 
					    for (size_t I=0;I<PswLength;I+=2)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      uint N1=(byte)CRCTab [ (byte(Password[I])   - J) &0xff];
 | 
				
			||||||
 | 
					      uint N2=(byte)CRCTab [ (byte(Password[I+1]) + J) &0xff];
 | 
				
			||||||
 | 
					      for (int K=1;N1!=N2;N1=(N1+1)&0xff,K++)
 | 
				
			||||||
 | 
					        Swap20(&SubstTable20[N1],&SubstTable20[(N1+I+K)&0xff]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Incomplete last block of password must be zero padded.
 | 
				
			||||||
 | 
					  if ((PswLength & CRYPT_BLOCK_MASK)!=0)
 | 
				
			||||||
 | 
					    for (size_t I=PswLength;I<=(PswLength|CRYPT_BLOCK_MASK);I++)
 | 
				
			||||||
 | 
					       Psw[I]=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (size_t I=0;I<PswLength;I+=CRYPT_BLOCK_SIZE)
 | 
				
			||||||
 | 
					    EncryptBlock20((byte *)Psw+I);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::EncryptBlock20(byte *Buf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint A,B,C,D,T,TA,TB;
 | 
				
			||||||
 | 
					  A=RawGet4(Buf+0)^Key20[0];
 | 
				
			||||||
 | 
					  B=RawGet4(Buf+4)^Key20[1];
 | 
				
			||||||
 | 
					  C=RawGet4(Buf+8)^Key20[2];
 | 
				
			||||||
 | 
					  D=RawGet4(Buf+12)^Key20[3];
 | 
				
			||||||
 | 
					  for(int I=0;I<NROUNDS;I++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    T=((C+rotls(D,11,32))^Key20[I&3]);
 | 
				
			||||||
 | 
					    TA=A^substLong(T);
 | 
				
			||||||
 | 
					    T=((D^rotls(C,17,32))+Key20[I&3]);
 | 
				
			||||||
 | 
					    TB=B^substLong(T);
 | 
				
			||||||
 | 
					    A=C;
 | 
				
			||||||
 | 
					    B=D;
 | 
				
			||||||
 | 
					    C=TA;
 | 
				
			||||||
 | 
					    D=TB;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  RawPut4(C^Key20[0],Buf+0);
 | 
				
			||||||
 | 
					  RawPut4(D^Key20[1],Buf+4);
 | 
				
			||||||
 | 
					  RawPut4(A^Key20[2],Buf+8);
 | 
				
			||||||
 | 
					  RawPut4(B^Key20[3],Buf+12);
 | 
				
			||||||
 | 
					  UpdKeys20(Buf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::DecryptBlock20(byte *Buf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  byte InBuf[16];
 | 
				
			||||||
 | 
					  uint A,B,C,D,T,TA,TB;
 | 
				
			||||||
 | 
					  A=RawGet4(Buf+0)^Key20[0];
 | 
				
			||||||
 | 
					  B=RawGet4(Buf+4)^Key20[1];
 | 
				
			||||||
 | 
					  C=RawGet4(Buf+8)^Key20[2];
 | 
				
			||||||
 | 
					  D=RawGet4(Buf+12)^Key20[3];
 | 
				
			||||||
 | 
					  memcpy(InBuf,Buf,sizeof(InBuf));
 | 
				
			||||||
 | 
					  for(int I=NROUNDS-1;I>=0;I--)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    T=((C+rotls(D,11,32))^Key20[I&3]);
 | 
				
			||||||
 | 
					    TA=A^substLong(T);
 | 
				
			||||||
 | 
					    T=((D^rotls(C,17,32))+Key20[I&3]);
 | 
				
			||||||
 | 
					    TB=B^substLong(T);
 | 
				
			||||||
 | 
					    A=C;
 | 
				
			||||||
 | 
					    B=D;
 | 
				
			||||||
 | 
					    C=TA;
 | 
				
			||||||
 | 
					    D=TB;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  RawPut4(C^Key20[0],Buf+0);
 | 
				
			||||||
 | 
					  RawPut4(D^Key20[1],Buf+4);
 | 
				
			||||||
 | 
					  RawPut4(A^Key20[2],Buf+8);
 | 
				
			||||||
 | 
					  RawPut4(B^Key20[3],Buf+12);
 | 
				
			||||||
 | 
					  UpdKeys20(InBuf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::UpdKeys20(byte *Buf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  for (int I=0;I<16;I+=4)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Key20[0]^=CRCTab[Buf[I]];
 | 
				
			||||||
 | 
					    Key20[1]^=CRCTab[Buf[I+1]];
 | 
				
			||||||
 | 
					    Key20[2]^=CRCTab[Buf[I+2]];
 | 
				
			||||||
 | 
					    Key20[3]^=CRCTab[Buf[I+3]];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::Swap20(byte *Ch1,byte *Ch2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  byte Ch=*Ch1;
 | 
				
			||||||
 | 
					  *Ch1=*Ch2;
 | 
				
			||||||
 | 
					  *Ch2=Ch;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,68 @@
 | 
				
			||||||
 | 
					void CryptData::SetKey30(bool Encrypt,SecPassword *Password,const wchar *PwdW,const byte *Salt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  byte AESKey[16],AESInit[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool Cached=false;
 | 
				
			||||||
 | 
					  for (uint I=0;I<ASIZE(KDF3Cache);I++)
 | 
				
			||||||
 | 
					    if (KDF3Cache[I].Pwd==*Password &&
 | 
				
			||||||
 | 
					        (Salt==NULL && !KDF3Cache[I].SaltPresent || Salt!=NULL &&
 | 
				
			||||||
 | 
					        KDF3Cache[I].SaltPresent && memcmp(KDF3Cache[I].Salt,Salt,SIZE_SALT30)==0))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      memcpy(AESKey,KDF3Cache[I].Key,sizeof(AESKey));
 | 
				
			||||||
 | 
					      SecHideData(AESKey,sizeof(AESKey),false,false);
 | 
				
			||||||
 | 
					      memcpy(AESInit,KDF3Cache[I].Init,sizeof(AESInit));
 | 
				
			||||||
 | 
					      Cached=true;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!Cached)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    byte RawPsw[2*MAXPASSWORD+SIZE_SALT30];
 | 
				
			||||||
 | 
					    WideToRaw(PwdW,RawPsw,ASIZE(RawPsw));
 | 
				
			||||||
 | 
					    size_t RawLength=2*wcslen(PwdW);
 | 
				
			||||||
 | 
					    if (Salt!=NULL)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      memcpy(RawPsw+RawLength,Salt,SIZE_SALT30);
 | 
				
			||||||
 | 
					      RawLength+=SIZE_SALT30;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    sha1_context c;
 | 
				
			||||||
 | 
					    sha1_init(&c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const uint HashRounds=0x40000;
 | 
				
			||||||
 | 
					    for (uint I=0;I<HashRounds;I++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      sha1_process_rar29( &c, RawPsw, RawLength );
 | 
				
			||||||
 | 
					      byte PswNum[3];
 | 
				
			||||||
 | 
					      PswNum[0]=(byte)I;
 | 
				
			||||||
 | 
					      PswNum[1]=(byte)(I>>8);
 | 
				
			||||||
 | 
					      PswNum[2]=(byte)(I>>16);
 | 
				
			||||||
 | 
					      sha1_process(&c, PswNum, 3);
 | 
				
			||||||
 | 
					      if (I%(HashRounds/16)==0)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        sha1_context tempc=c;
 | 
				
			||||||
 | 
					        uint32 digest[5];
 | 
				
			||||||
 | 
					        sha1_done( &tempc, digest );
 | 
				
			||||||
 | 
					        AESInit[I/(HashRounds/16)]=(byte)digest[4];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    uint32 digest[5];
 | 
				
			||||||
 | 
					    sha1_done( &c, digest );
 | 
				
			||||||
 | 
					    for (uint I=0;I<4;I++)
 | 
				
			||||||
 | 
					      for (uint J=0;J<4;J++)
 | 
				
			||||||
 | 
					        AESKey[I*4+J]=(byte)(digest[I]>>(J*8));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KDF3Cache[KDF3CachePos].Pwd=*Password;
 | 
				
			||||||
 | 
					    if ((KDF3Cache[KDF3CachePos].SaltPresent=(Salt!=NULL))==true)
 | 
				
			||||||
 | 
					      memcpy(KDF3Cache[KDF3CachePos].Salt,Salt,SIZE_SALT30);
 | 
				
			||||||
 | 
					    memcpy(KDF3Cache[KDF3CachePos].Key,AESKey,sizeof(AESKey));
 | 
				
			||||||
 | 
					    SecHideData(KDF3Cache[KDF3CachePos].Key,sizeof(KDF3Cache[KDF3CachePos].Key),true,false);
 | 
				
			||||||
 | 
					    memcpy(KDF3Cache[KDF3CachePos].Init,AESInit,sizeof(AESInit));
 | 
				
			||||||
 | 
					    KDF3CachePos=(KDF3CachePos+1)%ASIZE(KDF3Cache);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cleandata(RawPsw,sizeof(RawPsw));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  rin.Init(Encrypt, AESKey, 128, AESInit);
 | 
				
			||||||
 | 
					  cleandata(AESKey,sizeof(AESKey));
 | 
				
			||||||
 | 
					  cleandata(AESInit,sizeof(AESInit));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,233 @@
 | 
				
			||||||
 | 
					static void hmac_sha256(const byte *Key,size_t KeyLength,const byte *Data,
 | 
				
			||||||
 | 
					                        size_t DataLength,byte *ResDigest,
 | 
				
			||||||
 | 
					                        sha256_context *ICtxOpt,bool *SetIOpt,
 | 
				
			||||||
 | 
					                        sha256_context *RCtxOpt,bool *SetROpt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  const size_t Sha256BlockSize=64; // As defined in RFC 4868.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  byte KeyHash[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					  if (KeyLength > Sha256BlockSize) // Convert longer keys to key hash.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    sha256_context KCtx;
 | 
				
			||||||
 | 
					    sha256_init(&KCtx);
 | 
				
			||||||
 | 
					    sha256_process(&KCtx, Key, KeyLength);
 | 
				
			||||||
 | 
					    sha256_done(&KCtx, KeyHash);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Key = KeyHash;
 | 
				
			||||||
 | 
					    KeyLength = SHA256_DIGEST_SIZE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  byte KeyBuf[Sha256BlockSize]; // Store the padded key here.
 | 
				
			||||||
 | 
					  sha256_context ICtx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (ICtxOpt!=NULL && *SetIOpt)
 | 
				
			||||||
 | 
					    ICtx=*ICtxOpt; // Use already calculated first block context.
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // This calculation is the same for all iterations with same password.
 | 
				
			||||||
 | 
					    // So for PBKDF2 we can calculate it only for first block and then reuse
 | 
				
			||||||
 | 
					    // to improve performance. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (size_t I = 0; I < KeyLength; I++) // Use 0x36 padding for inner digest.
 | 
				
			||||||
 | 
					      KeyBuf[I] = Key[I] ^ 0x36;
 | 
				
			||||||
 | 
					    for (size_t I = KeyLength; I < Sha256BlockSize; I++)
 | 
				
			||||||
 | 
					      KeyBuf[I] = 0x36;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sha256_init(&ICtx);
 | 
				
			||||||
 | 
					    sha256_process(&ICtx, KeyBuf, Sha256BlockSize); // Hash padded key.
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (ICtxOpt!=NULL && !*SetIOpt) // Store constant context for further reuse.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *ICtxOpt=ICtx;
 | 
				
			||||||
 | 
					    *SetIOpt=true;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sha256_process(&ICtx, Data, DataLength); // Hash data.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  byte IDig[SHA256_DIGEST_SIZE]; // Internal digest for padded key and data.
 | 
				
			||||||
 | 
					  sha256_done(&ICtx, IDig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sha256_context RCtx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (RCtxOpt!=NULL && *SetROpt)
 | 
				
			||||||
 | 
					    RCtx=*RCtxOpt; // Use already calculated first block context.
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // This calculation is the same for all iterations with same password.
 | 
				
			||||||
 | 
					    // So for PBKDF2 we can calculate it only for first block and then reuse
 | 
				
			||||||
 | 
					    // to improve performance. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (size_t I = 0; I < KeyLength; I++) // Use 0x5c for outer key padding.
 | 
				
			||||||
 | 
					      KeyBuf[I] = Key[I] ^ 0x5c;
 | 
				
			||||||
 | 
					    for (size_t I = KeyLength; I < Sha256BlockSize; I++)
 | 
				
			||||||
 | 
					      KeyBuf[I] = 0x5c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sha256_init(&RCtx);
 | 
				
			||||||
 | 
					    sha256_process(&RCtx, KeyBuf, Sha256BlockSize); // Hash padded key.
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (RCtxOpt!=NULL && !*SetROpt) // Store constant context for further reuse.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *RCtxOpt=RCtx;
 | 
				
			||||||
 | 
					    *SetROpt=true;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sha256_process(&RCtx, IDig, SHA256_DIGEST_SIZE); // Hash internal digest.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sha256_done(&RCtx, ResDigest);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PBKDF2 for 32 byte key length. We generate the key for specified number
 | 
				
			||||||
 | 
					// of iteration count also as two supplementary values (key for checksums
 | 
				
			||||||
 | 
					// and password verification) for iterations+16 and iterations+32.
 | 
				
			||||||
 | 
					void pbkdf2(const byte *Pwd, size_t PwdLength, 
 | 
				
			||||||
 | 
					            const byte *Salt, size_t SaltLength,
 | 
				
			||||||
 | 
					            byte *Key, byte *V1, byte *V2, uint Count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  const size_t MaxSalt=64;
 | 
				
			||||||
 | 
					  byte SaltData[MaxSalt+4];
 | 
				
			||||||
 | 
					  memcpy(SaltData, Salt, Min(SaltLength,MaxSalt));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SaltData[SaltLength + 0] = 0; // Salt concatenated to 1.
 | 
				
			||||||
 | 
					  SaltData[SaltLength + 1] = 0;
 | 
				
			||||||
 | 
					  SaltData[SaltLength + 2] = 0;
 | 
				
			||||||
 | 
					  SaltData[SaltLength + 3] = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // First iteration: HMAC of password, salt and block index (1).
 | 
				
			||||||
 | 
					  byte U1[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					  hmac_sha256(Pwd, PwdLength, SaltData, SaltLength + 4, U1, NULL, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					  byte Fn[SHA256_DIGEST_SIZE]; // Current function value.
 | 
				
			||||||
 | 
					  memcpy(Fn, U1, sizeof(Fn)); // Function at first iteration.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint  CurCount[] = { Count-1, 16, 16 };
 | 
				
			||||||
 | 
					  byte *CurValue[] = { Key    , V1, V2 };
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  sha256_context ICtxOpt,RCtxOpt;
 | 
				
			||||||
 | 
					  bool SetIOpt=false,SetROpt=false;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  byte U2[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					  for (uint I = 0; I < 3; I++) // For output key and 2 supplementary values.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    for (uint J = 0; J < CurCount[I]; J++) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // U2 = PRF (P, U1).
 | 
				
			||||||
 | 
					      hmac_sha256(Pwd, PwdLength, U1, sizeof(U1), U2, &ICtxOpt, &SetIOpt, &RCtxOpt, &SetROpt);
 | 
				
			||||||
 | 
					      memcpy(U1, U2, sizeof(U1));
 | 
				
			||||||
 | 
					      for (uint K = 0; K < sizeof(Fn); K++) // Function ^= U.
 | 
				
			||||||
 | 
					        Fn[K] ^= U1[K];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    memcpy(CurValue[I], Fn, SHA256_DIGEST_SIZE);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cleandata(SaltData, sizeof(SaltData));
 | 
				
			||||||
 | 
					  cleandata(Fn, sizeof(Fn));
 | 
				
			||||||
 | 
					  cleandata(U1, sizeof(U1));
 | 
				
			||||||
 | 
					  cleandata(U2, sizeof(U2));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CryptData::SetKey50(bool Encrypt,SecPassword *Password,const wchar *PwdW,
 | 
				
			||||||
 | 
					     const byte *Salt,const byte *InitV,uint Lg2Cnt,byte *HashKey,
 | 
				
			||||||
 | 
					     byte *PswCheck)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (Lg2Cnt>CRYPT5_KDF_LG2_COUNT_MAX)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  byte Key[32],PswCheckValue[SHA256_DIGEST_SIZE],HashKeyValue[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					  bool Found=false;
 | 
				
			||||||
 | 
					  for (uint I=0;I<ASIZE(KDF5Cache);I++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    KDF5CacheItem *Item=KDF5Cache+I;
 | 
				
			||||||
 | 
					    if (Item->Lg2Count==Lg2Cnt && Item->Pwd==*Password &&
 | 
				
			||||||
 | 
					        memcmp(Item->Salt,Salt,SIZE_SALT50)==0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      memcpy(Key,Item->Key,sizeof(Key));
 | 
				
			||||||
 | 
					      SecHideData(Key,sizeof(Key),false,false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      memcpy(PswCheckValue,Item->PswCheckValue,sizeof(PswCheckValue));
 | 
				
			||||||
 | 
					      memcpy(HashKeyValue,Item->HashKeyValue,sizeof(HashKeyValue));
 | 
				
			||||||
 | 
					      Found=true;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!Found)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char PwdUtf[MAXPASSWORD*4];
 | 
				
			||||||
 | 
					    WideToUtf(PwdW,PwdUtf,ASIZE(PwdUtf));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    pbkdf2((byte *)PwdUtf,strlen(PwdUtf),Salt,SIZE_SALT50,Key,HashKeyValue,PswCheckValue,(1<<Lg2Cnt));
 | 
				
			||||||
 | 
					    cleandata(PwdUtf,sizeof(PwdUtf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KDF5CacheItem *Item=KDF5Cache+(KDF5CachePos++ % ASIZE(KDF5Cache));
 | 
				
			||||||
 | 
					    Item->Lg2Count=Lg2Cnt;
 | 
				
			||||||
 | 
					    Item->Pwd=*Password;
 | 
				
			||||||
 | 
					    memcpy(Item->Salt,Salt,SIZE_SALT50);
 | 
				
			||||||
 | 
					    memcpy(Item->Key,Key,sizeof(Item->Key));
 | 
				
			||||||
 | 
					    memcpy(Item->PswCheckValue,PswCheckValue,sizeof(PswCheckValue));
 | 
				
			||||||
 | 
					    memcpy(Item->HashKeyValue,HashKeyValue,sizeof(HashKeyValue));
 | 
				
			||||||
 | 
					    SecHideData(Item->Key,sizeof(Item->Key),true,false);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (HashKey!=NULL)
 | 
				
			||||||
 | 
					    memcpy(HashKey,HashKeyValue,SHA256_DIGEST_SIZE);
 | 
				
			||||||
 | 
					  if (PswCheck!=NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    memset(PswCheck,0,SIZE_PSWCHECK);
 | 
				
			||||||
 | 
					    for (uint I=0;I<SHA256_DIGEST_SIZE;I++)
 | 
				
			||||||
 | 
					      PswCheck[I%SIZE_PSWCHECK]^=PswCheckValue[I];
 | 
				
			||||||
 | 
					    cleandata(PswCheckValue,sizeof(PswCheckValue));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // NULL initialization vector is possible if we only need the password
 | 
				
			||||||
 | 
					  // check value for archive encryption header.
 | 
				
			||||||
 | 
					  if (InitV!=NULL)
 | 
				
			||||||
 | 
					    rin.Init(Encrypt, Key, 256, InitV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cleandata(Key,sizeof(Key));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ConvertHashToMAC(HashValue *Value,byte *Key)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (Value->Type==HASH_CRC32)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    byte RawCRC[4];
 | 
				
			||||||
 | 
					    RawPut4(Value->CRC32,RawCRC);
 | 
				
			||||||
 | 
					    byte Digest[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					    hmac_sha256(Key,SHA256_DIGEST_SIZE,RawCRC,sizeof(RawCRC),Digest,NULL,NULL,NULL,NULL);
 | 
				
			||||||
 | 
					    Value->CRC32=0;
 | 
				
			||||||
 | 
					    for (uint I=0;I<ASIZE(Digest);I++)
 | 
				
			||||||
 | 
					      Value->CRC32^=Digest[I] << ((I & 3) * 8);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (Value->Type==HASH_BLAKE2)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    byte Digest[BLAKE2_DIGEST_SIZE];
 | 
				
			||||||
 | 
					    hmac_sha256(Key,BLAKE2_DIGEST_SIZE,Value->Digest,sizeof(Value->Digest),Digest,NULL,NULL,NULL,NULL);
 | 
				
			||||||
 | 
					    memcpy(Value->Digest,Digest,sizeof(Value->Digest));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					static void TestPBKDF2();
 | 
				
			||||||
 | 
					struct TestKDF {TestKDF() {TestPBKDF2();exit(0);}} GlobalTestKDF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TestPBKDF2() // Test PBKDF2 HMAC-SHA256
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  byte Key[32],V1[32],V2[32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pbkdf2((byte *)"password", 8, (byte *)"salt", 4, Key, V1, V2, 1);
 | 
				
			||||||
 | 
					  byte Res1[32]={0x12, 0x0f, 0xb6, 0xcf, 0xfc, 0xf8, 0xb3, 0x2c, 0x43, 0xe7, 0x22, 0x52, 0x56, 0xc4, 0xf8, 0x37, 0xa8, 0x65, 0x48, 0xc9, 0x2c, 0xcc, 0x35, 0x48, 0x08, 0x05, 0x98, 0x7c, 0xb7, 0x0b, 0xe1, 0x7b };
 | 
				
			||||||
 | 
					  mprintf(L"\nPBKDF2 test1: %s", memcmp(Key,Res1,32)==0 ? L"OK":L"Failed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pbkdf2((byte *)"password", 8, (byte *)"salt", 4, Key, V1, V2, 4096);
 | 
				
			||||||
 | 
					  byte Res2[32]={0xc5, 0xe4, 0x78, 0xd5, 0x92, 0x88, 0xc8, 0x41, 0xaa, 0x53, 0x0d, 0xb6, 0x84, 0x5c, 0x4c, 0x8d, 0x96, 0x28, 0x93, 0xa0, 0x01, 0xce, 0x4e, 0x11, 0xa4, 0x96, 0x38, 0x73, 0xaa, 0x98, 0x13, 0x4a };
 | 
				
			||||||
 | 
					  mprintf(L"\nPBKDF2 test2: %s", memcmp(Key,Res2,32)==0 ? L"OK":L"Failed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pbkdf2((byte *)"just some long string pretending to be a password", 49, (byte *)"salt, salt, salt, a lot of salt", 31, Key, V1, V2, 65536);
 | 
				
			||||||
 | 
					  byte Res3[32]={0x08, 0x0f, 0xa3, 0x1d, 0x42, 0x2d, 0xb0, 0x47, 0x83, 0x9b, 0xce, 0x3a, 0x3b, 0xce, 0x49, 0x51, 0xe2, 0x62, 0xb9, 0xff, 0x76, 0x2f, 0x57, 0xe9, 0xc4, 0x71, 0x96, 0xce, 0x4b, 0x6b, 0x6e, 0xbf};
 | 
				
			||||||
 | 
					  mprintf(L"\nPBKDF2 test3: %s", memcmp(Key,Res3,32)==0 ? L"OK":L"Failed");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										494
									
								
								libunrar/dll.cpp
								
								
								
								
							
							
						
						
									
										494
									
								
								libunrar/dll.cpp
								
								
								
								
							| 
						 | 
					@ -1,17 +1,16 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
#include "dll.hpp"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int RarErrorToDll(int ErrCode);
 | 
					static int RarErrorToDll(RAR_EXIT ErrCode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct DataSet
 | 
					struct DataSet
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CommandData Cmd;
 | 
					  CommandData Cmd;
 | 
				
			||||||
  CmdExtract Extract;
 | 
					 | 
				
			||||||
  Archive Arc;
 | 
					  Archive Arc;
 | 
				
			||||||
 | 
					  CmdExtract Extract;
 | 
				
			||||||
  int OpenMode;
 | 
					  int OpenMode;
 | 
				
			||||||
  int HeaderSize;
 | 
					  int HeaderSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DataSet():Arc(&Cmd) {};
 | 
					  DataSet():Arc(&Cmd),Extract(&Cmd) {};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,124 +26,183 @@ HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *r)
 | 
				
			||||||
  r->OpenResult=rx.OpenResult;
 | 
					  r->OpenResult=rx.OpenResult;
 | 
				
			||||||
  r->CmtSize=rx.CmtSize;
 | 
					  r->CmtSize=rx.CmtSize;
 | 
				
			||||||
  r->CmtState=rx.CmtState;
 | 
					  r->CmtState=rx.CmtState;
 | 
				
			||||||
  return(hArc);
 | 
					  return hArc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *r)
 | 
					HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *r)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  DataSet *Data=NULL;
 | 
				
			||||||
  try
 | 
					  try
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    ErrHandler.Clean();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    r->OpenResult=0;
 | 
					    r->OpenResult=0;
 | 
				
			||||||
    DataSet *Data=new DataSet;
 | 
					    Data=new DataSet;
 | 
				
			||||||
    Data->Cmd.DllError=0;
 | 
					    Data->Cmd.DllError=0;
 | 
				
			||||||
    Data->OpenMode=r->OpenMode;
 | 
					    Data->OpenMode=r->OpenMode;
 | 
				
			||||||
    Data->Cmd.FileArgs->AddString("*");
 | 
					    Data->Cmd.FileArgs.AddString(L"*");
 | 
				
			||||||
 | 
					    Data->Cmd.KeepBroken=(r->OpFlags&ROADOF_KEEPBROKEN)!=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char an[NM];
 | 
					    char AnsiArcName[NM];
 | 
				
			||||||
    if (r->ArcName==NULL && r->ArcNameW!=NULL)
 | 
					    *AnsiArcName=0;
 | 
				
			||||||
 | 
					    if (r->ArcName!=NULL)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      WideToChar(r->ArcNameW,an,NM);
 | 
					      strncpyz(AnsiArcName,r->ArcName,ASIZE(AnsiArcName));
 | 
				
			||||||
      r->ArcName=an;
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					      if (!AreFileApisANSI())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        OemToCharBuffA(r->ArcName,AnsiArcName,ASIZE(AnsiArcName));
 | 
				
			||||||
 | 
					        AnsiArcName[ASIZE(AnsiArcName)-1]=0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Data->Cmd.AddArcName(r->ArcName,r->ArcNameW);
 | 
					    wchar ArcName[NM];
 | 
				
			||||||
 | 
					    GetWideName(AnsiArcName,r->ArcNameW,ArcName,ASIZE(ArcName));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Data->Cmd.AddArcName(ArcName);
 | 
				
			||||||
    Data->Cmd.Overwrite=OVERWRITE_ALL;
 | 
					    Data->Cmd.Overwrite=OVERWRITE_ALL;
 | 
				
			||||||
    Data->Cmd.VersionControl=1;
 | 
					    Data->Cmd.VersionControl=1;
 | 
				
			||||||
    if (!Data->Arc.Open(r->ArcName,r->ArcNameW))
 | 
					
 | 
				
			||||||
 | 
					    Data->Cmd.Callback=r->Callback;
 | 
				
			||||||
 | 
					    Data->Cmd.UserData=r->UserData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Open shared mode is added by request of dll users, who need to
 | 
				
			||||||
 | 
					    // browse and unpack archives while downloading.
 | 
				
			||||||
 | 
					    Data->Cmd.OpenShared = true;
 | 
				
			||||||
 | 
					    if (!Data->Arc.Open(ArcName,FMF_OPENSHARED))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      r->OpenResult=ERAR_EOPEN;
 | 
					      r->OpenResult=ERAR_EOPEN;
 | 
				
			||||||
      delete Data;
 | 
					      delete Data;
 | 
				
			||||||
      return(NULL);
 | 
					      return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!Data->Arc.IsArchive(false))
 | 
					    if (!Data->Arc.IsArchive(true))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      r->OpenResult=Data->Cmd.DllError!=0 ? Data->Cmd.DllError:ERAR_BAD_ARCHIVE;
 | 
					      if (Data->Cmd.DllError!=0)
 | 
				
			||||||
 | 
					        r->OpenResult=Data->Cmd.DllError;
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        RAR_EXIT ErrCode=ErrHandler.GetErrorCode();
 | 
				
			||||||
 | 
					        if (ErrCode!=RARX_SUCCESS && ErrCode!=RARX_WARNING)
 | 
				
			||||||
 | 
					          r->OpenResult=RarErrorToDll(ErrCode);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          r->OpenResult=ERAR_BAD_ARCHIVE;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      delete Data;
 | 
					      delete Data;
 | 
				
			||||||
      return(NULL);
 | 
					      return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    r->Flags=Data->Arc.NewMhd.Flags;
 | 
					    r->Flags=0;
 | 
				
			||||||
    Array<byte> CmtData;
 | 
					    
 | 
				
			||||||
    if (r->CmtBufSize!=0 && Data->Arc.GetComment(&CmtData,NULL))
 | 
					    if (Data->Arc.Volume)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_VOLUME;
 | 
				
			||||||
 | 
					    if (Data->Arc.MainComment)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_COMMENT;
 | 
				
			||||||
 | 
					    if (Data->Arc.Locked)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_LOCK;
 | 
				
			||||||
 | 
					    if (Data->Arc.Solid)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_SOLID;
 | 
				
			||||||
 | 
					    if (Data->Arc.NewNumbering)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_NEWNUMBERING;
 | 
				
			||||||
 | 
					    if (Data->Arc.Signed)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_SIGNED;
 | 
				
			||||||
 | 
					    if (Data->Arc.Protected)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_RECOVERY;
 | 
				
			||||||
 | 
					    if (Data->Arc.Encrypted)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_ENCHEADERS;
 | 
				
			||||||
 | 
					    if (Data->Arc.FirstVolume)
 | 
				
			||||||
 | 
					      r->Flags|=ROADF_FIRSTVOLUME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Array<wchar> CmtDataW;
 | 
				
			||||||
 | 
					    if (r->CmtBufSize!=0 && Data->Arc.GetComment(&CmtDataW))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      r->Flags|=2;
 | 
					      if (r->CmtBufW!=NULL)
 | 
				
			||||||
      size_t Size=CmtData.Size()+1;
 | 
					      {
 | 
				
			||||||
      r->CmtState=Size>r->CmtBufSize ? ERAR_SMALL_BUF:1;
 | 
					        CmtDataW.Push(0);
 | 
				
			||||||
      r->CmtSize=(uint)Min(Size,r->CmtBufSize);
 | 
					        size_t Size=wcslen(&CmtDataW[0])+1;
 | 
				
			||||||
      memcpy(r->CmtBuf,&CmtData[0],r->CmtSize-1);
 | 
					
 | 
				
			||||||
      if (Size<=r->CmtBufSize)
 | 
					        r->CmtState=Size>r->CmtBufSize ? ERAR_SMALL_BUF:1;
 | 
				
			||||||
        r->CmtBuf[r->CmtSize-1]=0;
 | 
					        r->CmtSize=(uint)Min(Size,r->CmtBufSize);
 | 
				
			||||||
 | 
					        memcpy(r->CmtBufW,&CmtDataW[0],(r->CmtSize-1)*sizeof(*r->CmtBufW));
 | 
				
			||||||
 | 
					        r->CmtBufW[r->CmtSize-1]=0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        if (r->CmtBuf!=NULL)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Array<char> CmtData(CmtDataW.Size()*4+1);
 | 
				
			||||||
 | 
					          memset(&CmtData[0],0,CmtData.Size());
 | 
				
			||||||
 | 
					          WideToChar(&CmtDataW[0],&CmtData[0],CmtData.Size()-1);
 | 
				
			||||||
 | 
					          size_t Size=strlen(&CmtData[0])+1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          r->CmtState=Size>r->CmtBufSize ? ERAR_SMALL_BUF:1;
 | 
				
			||||||
 | 
					          r->CmtSize=(uint)Min(Size,r->CmtBufSize);
 | 
				
			||||||
 | 
					          memcpy(r->CmtBuf,&CmtData[0],r->CmtSize-1);
 | 
				
			||||||
 | 
					          r->CmtBuf[r->CmtSize-1]=0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      r->CmtState=r->CmtSize=0;
 | 
					      r->CmtState=r->CmtSize=0;
 | 
				
			||||||
    if (Data->Arc.Signed)
 | 
					    Data->Extract.ExtractArchiveInit(Data->Arc);
 | 
				
			||||||
      r->Flags|=0x20;
 | 
					    return (HANDLE)Data;
 | 
				
			||||||
    Data->Extract.ExtractArchiveInit(&Data->Cmd,Data->Arc);
 | 
					 | 
				
			||||||
    return((HANDLE)Data);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  catch (int ErrCode)
 | 
					  catch (RAR_EXIT ErrCode)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    r->OpenResult=RarErrorToDll(ErrCode);
 | 
					    if (Data!=NULL && Data->Cmd.DllError!=0)
 | 
				
			||||||
    return(NULL);
 | 
					      r->OpenResult=Data->Cmd.DllError;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      r->OpenResult=RarErrorToDll(ErrCode);
 | 
				
			||||||
 | 
					    if (Data != NULL)
 | 
				
			||||||
 | 
					      delete Data;
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  catch (std::bad_alloc&) // Catch 'new' exception.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    r->OpenResult=ERAR_NO_MEMORY;
 | 
				
			||||||
 | 
					    if (Data != NULL)
 | 
				
			||||||
 | 
					      delete Data;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return NULL; // To make compilers happy.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PASCAL RARCloseArchive(HANDLE hArcData)
 | 
					int PASCAL RARCloseArchive(HANDLE hArcData)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  DataSet *Data=(DataSet *)hArcData;
 | 
					  DataSet *Data=(DataSet *)hArcData;
 | 
				
			||||||
  bool Success=Data==NULL ? false:Data->Arc.Close();
 | 
					  try
 | 
				
			||||||
  delete Data;
 | 
					  {
 | 
				
			||||||
  return(Success ? 0:ERAR_ECLOSE);
 | 
					    bool Success=Data==NULL ? false:Data->Arc.Close();
 | 
				
			||||||
 | 
					    delete Data;
 | 
				
			||||||
 | 
					    return Success ? ERAR_SUCCESS : ERAR_ECLOSE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  catch (RAR_EXIT ErrCode)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return Data->Cmd.DllError!=0 ? Data->Cmd.DllError : RarErrorToDll(ErrCode);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *D)
 | 
					int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *D)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  DataSet *Data=(DataSet *)hArcData;
 | 
					  struct RARHeaderDataEx X;
 | 
				
			||||||
  try
 | 
					  memset(&X,0,sizeof(X));
 | 
				
			||||||
  {
 | 
					
 | 
				
			||||||
    if ((Data->HeaderSize=(int)Data->Arc.SearchBlock(FILE_HEAD))<=0)
 | 
					  int Code=RARReadHeaderEx(hArcData,&X);
 | 
				
			||||||
    {
 | 
					
 | 
				
			||||||
      if (Data->Arc.Volume && Data->Arc.GetHeaderType()==ENDARC_HEAD &&
 | 
					  strncpyz(D->ArcName,X.ArcName,ASIZE(D->ArcName));
 | 
				
			||||||
          (Data->Arc.EndArcHead.Flags & EARC_NEXT_VOLUME))
 | 
					  strncpyz(D->FileName,X.FileName,ASIZE(D->FileName));
 | 
				
			||||||
        if (MergeArchive(Data->Arc,NULL,false,'L'))
 | 
					  D->Flags=X.Flags;
 | 
				
			||||||
        {
 | 
					  D->PackSize=X.PackSize;
 | 
				
			||||||
          Data->Extract.SignatureFound=false;
 | 
					  D->UnpSize=X.UnpSize;
 | 
				
			||||||
          Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
 | 
					  D->HostOS=X.HostOS;
 | 
				
			||||||
          return(RARReadHeader(hArcData,D));
 | 
					  D->FileCRC=X.FileCRC;
 | 
				
			||||||
        }
 | 
					  D->FileTime=X.FileTime;
 | 
				
			||||||
        else
 | 
					  D->UnpVer=X.UnpVer;
 | 
				
			||||||
          return(ERAR_EOPEN);
 | 
					  D->Method=X.Method;
 | 
				
			||||||
      return(Data->Arc.BrokenFileHeader ? ERAR_BAD_DATA:ERAR_END_ARCHIVE);
 | 
					  D->FileAttr=X.FileAttr;
 | 
				
			||||||
    }
 | 
					  D->CmtSize=0;
 | 
				
			||||||
    if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE))
 | 
					  D->CmtState=0;
 | 
				
			||||||
    {
 | 
					
 | 
				
			||||||
      int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL);
 | 
					  return Code;
 | 
				
			||||||
      if (Code==0)
 | 
					 | 
				
			||||||
        return(RARReadHeader(hArcData,D));
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        return(Code);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    strncpyz(D->ArcName,Data->Arc.FileName,ASIZE(D->ArcName));
 | 
					 | 
				
			||||||
    strncpyz(D->FileName,Data->Arc.NewLhd.FileName,ASIZE(D->FileName));
 | 
					 | 
				
			||||||
    D->Flags=Data->Arc.NewLhd.Flags;
 | 
					 | 
				
			||||||
    D->PackSize=Data->Arc.NewLhd.PackSize;
 | 
					 | 
				
			||||||
    D->UnpSize=Data->Arc.NewLhd.UnpSize;
 | 
					 | 
				
			||||||
    D->HostOS=Data->Arc.NewLhd.HostOS;
 | 
					 | 
				
			||||||
    D->FileCRC=Data->Arc.NewLhd.FileCRC;
 | 
					 | 
				
			||||||
    D->FileTime=Data->Arc.NewLhd.FileTime;
 | 
					 | 
				
			||||||
    D->UnpVer=Data->Arc.NewLhd.UnpVer;
 | 
					 | 
				
			||||||
    D->Method=Data->Arc.NewLhd.Method;
 | 
					 | 
				
			||||||
    D->FileAttr=Data->Arc.NewLhd.FileAttr;
 | 
					 | 
				
			||||||
    D->CmtSize=0;
 | 
					 | 
				
			||||||
    D->CmtState=0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  catch (int ErrCode)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    return(RarErrorToDll(ErrCode));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return(0);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -153,65 +211,114 @@ int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *D)
 | 
				
			||||||
  DataSet *Data=(DataSet *)hArcData;
 | 
					  DataSet *Data=(DataSet *)hArcData;
 | 
				
			||||||
  try
 | 
					  try
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if ((Data->HeaderSize=(int)Data->Arc.SearchBlock(FILE_HEAD))<=0)
 | 
					    if ((Data->HeaderSize=(int)Data->Arc.SearchBlock(HEAD_FILE))<=0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      if (Data->Arc.Volume && Data->Arc.GetHeaderType()==ENDARC_HEAD &&
 | 
					      if (Data->Arc.Volume && Data->Arc.GetHeaderType()==HEAD_ENDARC &&
 | 
				
			||||||
          (Data->Arc.EndArcHead.Flags & EARC_NEXT_VOLUME))
 | 
					          Data->Arc.EndArcHead.NextVolume)
 | 
				
			||||||
        if (MergeArchive(Data->Arc,NULL,false,'L'))
 | 
					        if (MergeArchive(Data->Arc,NULL,false,'L'))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          Data->Extract.SignatureFound=false;
 | 
					 | 
				
			||||||
          Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
 | 
					          Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
 | 
				
			||||||
          return(RARReadHeaderEx(hArcData,D));
 | 
					          return RARReadHeaderEx(hArcData,D);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
          return(ERAR_EOPEN);
 | 
					          return ERAR_EOPEN;
 | 
				
			||||||
      return(Data->Arc.BrokenFileHeader ? ERAR_BAD_DATA:ERAR_END_ARCHIVE);
 | 
					
 | 
				
			||||||
 | 
					      if (Data->Arc.BrokenHeader)
 | 
				
			||||||
 | 
					        return ERAR_BAD_DATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Might be necessary if RARSetPassword is still called instead of
 | 
				
			||||||
 | 
					      // open callback for RAR5 archives and if password is invalid.
 | 
				
			||||||
 | 
					      if (Data->Arc.FailedHeaderDecryption)
 | 
				
			||||||
 | 
					        return ERAR_BAD_PASSWORD;
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      return ERAR_END_ARCHIVE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE))
 | 
					    FileHeader *hd=&Data->Arc.FileHead;
 | 
				
			||||||
 | 
					    if (Data->OpenMode==RAR_OM_LIST && hd->SplitBefore)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL);
 | 
					      int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL);
 | 
				
			||||||
      if (Code==0)
 | 
					      if (Code==0)
 | 
				
			||||||
        return(RARReadHeaderEx(hArcData,D));
 | 
					        return RARReadHeaderEx(hArcData,D);
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        return(Code);
 | 
					        return Code;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    strncpyz(D->ArcName,Data->Arc.FileName,ASIZE(D->ArcName));
 | 
					    wcsncpy(D->ArcNameW,Data->Arc.FileName,ASIZE(D->ArcNameW));
 | 
				
			||||||
    if (*Data->Arc.FileNameW)
 | 
					    WideToChar(D->ArcNameW,D->ArcName,ASIZE(D->ArcName));
 | 
				
			||||||
      strncpyw(D->ArcNameW,Data->Arc.FileNameW,sizeof(D->ArcNameW));
 | 
					
 | 
				
			||||||
    else
 | 
					    wcsncpy(D->FileNameW,hd->FileName,ASIZE(D->FileNameW));
 | 
				
			||||||
      CharToWide(Data->Arc.FileName,D->ArcNameW);
 | 
					    WideToChar(D->FileNameW,D->FileName,ASIZE(D->FileName));
 | 
				
			||||||
    strncpyz(D->FileName,Data->Arc.NewLhd.FileName,ASIZE(D->FileName));
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    if (*Data->Arc.NewLhd.FileNameW)
 | 
					    CharToOemA(D->FileName,D->FileName);
 | 
				
			||||||
      strncpyw(D->FileNameW,Data->Arc.NewLhd.FileNameW,sizeof(D->FileNameW));
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
      char AnsiName[NM];
 | 
					 | 
				
			||||||
      OemToChar(Data->Arc.NewLhd.FileName,AnsiName);
 | 
					 | 
				
			||||||
      CharToWide(AnsiName,D->FileNameW);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
      CharToWide(Data->Arc.NewLhd.FileName,D->FileNameW);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
    D->Flags=Data->Arc.NewLhd.Flags;
 | 
					    D->Flags=0;
 | 
				
			||||||
    D->PackSize=Data->Arc.NewLhd.PackSize;
 | 
					    if (hd->SplitBefore)
 | 
				
			||||||
    D->PackSizeHigh=Data->Arc.NewLhd.HighPackSize;
 | 
					      D->Flags|=RHDF_SPLITBEFORE;
 | 
				
			||||||
    D->UnpSize=Data->Arc.NewLhd.UnpSize;
 | 
					    if (hd->SplitAfter)
 | 
				
			||||||
    D->UnpSizeHigh=Data->Arc.NewLhd.HighUnpSize;
 | 
					      D->Flags|=RHDF_SPLITAFTER;
 | 
				
			||||||
    D->HostOS=Data->Arc.NewLhd.HostOS;
 | 
					    if (hd->Encrypted)
 | 
				
			||||||
    D->FileCRC=Data->Arc.NewLhd.FileCRC;
 | 
					      D->Flags|=RHDF_ENCRYPTED;
 | 
				
			||||||
    D->FileTime=Data->Arc.NewLhd.FileTime;
 | 
					    if (hd->Solid)
 | 
				
			||||||
    D->UnpVer=Data->Arc.NewLhd.UnpVer;
 | 
					      D->Flags|=RHDF_SOLID;
 | 
				
			||||||
    D->Method=Data->Arc.NewLhd.Method;
 | 
					    if (hd->Dir)
 | 
				
			||||||
    D->FileAttr=Data->Arc.NewLhd.FileAttr;
 | 
					      D->Flags|=RHDF_DIRECTORY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    D->PackSize=uint(hd->PackSize & 0xffffffff);
 | 
				
			||||||
 | 
					    D->PackSizeHigh=uint(hd->PackSize>>32);
 | 
				
			||||||
 | 
					    D->UnpSize=uint(hd->UnpSize & 0xffffffff);
 | 
				
			||||||
 | 
					    D->UnpSizeHigh=uint(hd->UnpSize>>32);
 | 
				
			||||||
 | 
					    D->HostOS=hd->HSType==HSYS_WINDOWS ? HOST_WIN32:HOST_UNIX;
 | 
				
			||||||
 | 
					    D->UnpVer=Data->Arc.FileHead.UnpVer;
 | 
				
			||||||
 | 
					    D->FileCRC=hd->FileHash.CRC32;
 | 
				
			||||||
 | 
					    D->FileTime=hd->mtime.GetDos();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    uint64 MRaw=hd->mtime.GetWin();
 | 
				
			||||||
 | 
					    D->MtimeLow=(uint)MRaw;
 | 
				
			||||||
 | 
					    D->MtimeHigh=(uint)(MRaw>>32);
 | 
				
			||||||
 | 
					    uint64 CRaw=hd->ctime.GetWin();
 | 
				
			||||||
 | 
					    D->CtimeLow=(uint)CRaw;
 | 
				
			||||||
 | 
					    D->CtimeHigh=(uint)(CRaw>>32);
 | 
				
			||||||
 | 
					    uint64 ARaw=hd->atime.GetWin();
 | 
				
			||||||
 | 
					    D->AtimeLow=(uint)ARaw;
 | 
				
			||||||
 | 
					    D->AtimeHigh=(uint)(ARaw>>32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    D->Method=hd->Method+0x30;
 | 
				
			||||||
 | 
					    D->FileAttr=hd->FileAttr;
 | 
				
			||||||
    D->CmtSize=0;
 | 
					    D->CmtSize=0;
 | 
				
			||||||
    D->CmtState=0;
 | 
					    D->CmtState=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    D->DictSize=uint(hd->WinSize/1024);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (hd->FileHash.Type)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case HASH_RAR14:
 | 
				
			||||||
 | 
					      case HASH_CRC32:
 | 
				
			||||||
 | 
					        D->HashType=RAR_HASH_CRC32;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case HASH_BLAKE2:
 | 
				
			||||||
 | 
					        D->HashType=RAR_HASH_BLAKE2;
 | 
				
			||||||
 | 
					        memcpy(D->Hash,hd->FileHash.Digest,BLAKE2_DIGEST_SIZE);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        D->HashType=RAR_HASH_NONE;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    D->RedirType=hd->RedirType;
 | 
				
			||||||
 | 
					    // RedirNameSize sanity check is useful in case some developer
 | 
				
			||||||
 | 
					    // did not initialize Reserved area with 0 as required in docs.
 | 
				
			||||||
 | 
					    // We have taken 'Redir*' fields from Reserved area. We may remove
 | 
				
			||||||
 | 
					    // this RedirNameSize check sometimes later.
 | 
				
			||||||
 | 
					    if (hd->RedirType!=FSREDIR_NONE && D->RedirName!=NULL &&
 | 
				
			||||||
 | 
					        D->RedirNameSize>0 && D->RedirNameSize<100000)
 | 
				
			||||||
 | 
					      wcsncpyz(D->RedirName,hd->RedirName,D->RedirNameSize);
 | 
				
			||||||
 | 
					    D->DirTarget=hd->DirTarget;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  catch (int ErrCode)
 | 
					  catch (RAR_EXIT ErrCode)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    return(RarErrorToDll(ErrCode));
 | 
					    return Data->Cmd.DllError!=0 ? Data->Cmd.DllError : RarErrorToDll(ErrCode);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(0);
 | 
					  return ERAR_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -224,88 +331,101 @@ int PASCAL ProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestNa
 | 
				
			||||||
    if (Data->OpenMode==RAR_OM_LIST || Data->OpenMode==RAR_OM_LIST_INCSPLIT ||
 | 
					    if (Data->OpenMode==RAR_OM_LIST || Data->OpenMode==RAR_OM_LIST_INCSPLIT ||
 | 
				
			||||||
        Operation==RAR_SKIP && !Data->Arc.Solid)
 | 
					        Operation==RAR_SKIP && !Data->Arc.Solid)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      if (Data->Arc.Volume &&
 | 
					      if (Data->Arc.Volume && Data->Arc.GetHeaderType()==HEAD_FILE &&
 | 
				
			||||||
          Data->Arc.GetHeaderType()==FILE_HEAD &&
 | 
					          Data->Arc.FileHead.SplitAfter)
 | 
				
			||||||
          (Data->Arc.NewLhd.Flags & LHD_SPLIT_AFTER)!=0)
 | 
					 | 
				
			||||||
        if (MergeArchive(Data->Arc,NULL,false,'L'))
 | 
					        if (MergeArchive(Data->Arc,NULL,false,'L'))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          Data->Extract.SignatureFound=false;
 | 
					 | 
				
			||||||
          Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
 | 
					          Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
 | 
				
			||||||
          return(0);
 | 
					          return ERAR_SUCCESS;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
          return(ERAR_EOPEN);
 | 
					          return ERAR_EOPEN;
 | 
				
			||||||
      Data->Arc.SeekToNext();
 | 
					      Data->Arc.SeekToNext();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      Data->Cmd.DllOpMode=Operation;
 | 
					      Data->Cmd.DllOpMode=Operation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (DestPath!=NULL || DestName!=NULL)
 | 
					      *Data->Cmd.ExtrPath=0;
 | 
				
			||||||
 | 
					      *Data->Cmd.DllDestName=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (DestPath!=NULL)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
#ifdef _WIN_32
 | 
					        char ExtrPathA[NM];
 | 
				
			||||||
        OemToChar(NullToEmpty(DestPath),Data->Cmd.ExtrPath);
 | 
					        strncpyz(ExtrPathA,DestPath,ASIZE(ExtrPathA)-2);
 | 
				
			||||||
#else
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
        strcpy(Data->Cmd.ExtrPath,NullToEmpty(DestPath));
 | 
					        // We must not apply OemToCharBuffA directly to DestPath,
 | 
				
			||||||
 | 
					        // because we do not know DestPath length and OemToCharBuffA
 | 
				
			||||||
 | 
					        // does not stop at 0.
 | 
				
			||||||
 | 
					        OemToCharA(ExtrPathA,ExtrPathA);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        AddEndSlash(Data->Cmd.ExtrPath);
 | 
					        CharToWide(ExtrPathA,Data->Cmd.ExtrPath,ASIZE(Data->Cmd.ExtrPath));
 | 
				
			||||||
#ifdef _WIN_32
 | 
					        AddEndSlash(Data->Cmd.ExtrPath,ASIZE(Data->Cmd.ExtrPath));
 | 
				
			||||||
        OemToChar(NullToEmpty(DestName),Data->Cmd.DllDestName);
 | 
					      }
 | 
				
			||||||
#else
 | 
					      if (DestName!=NULL)
 | 
				
			||||||
        strcpy(Data->Cmd.DllDestName,NullToEmpty(DestName));
 | 
					      {
 | 
				
			||||||
 | 
					        char DestNameA[NM];
 | 
				
			||||||
 | 
					        strncpyz(DestNameA,DestName,ASIZE(DestNameA)-2);
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					        // We must not apply OemToCharBuffA directly to DestName,
 | 
				
			||||||
 | 
					        // because we do not know DestName length and OemToCharBuffA
 | 
				
			||||||
 | 
					        // does not stop at 0.
 | 
				
			||||||
 | 
					        OemToCharA(DestNameA,DestNameA);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
      }
 | 
					        CharToWide(DestNameA,Data->Cmd.DllDestName,ASIZE(Data->Cmd.DllDestName));
 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        *Data->Cmd.ExtrPath=0;
 | 
					 | 
				
			||||||
        *Data->Cmd.DllDestName=0;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (DestPathW!=NULL || DestNameW!=NULL)
 | 
					      if (DestPathW!=NULL)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        strncpyw(Data->Cmd.ExtrPathW,NullToEmpty(DestPathW),NM-2);
 | 
					        wcsncpy(Data->Cmd.ExtrPath,DestPathW,ASIZE(Data->Cmd.ExtrPath));
 | 
				
			||||||
        AddEndSlash(Data->Cmd.ExtrPathW);
 | 
					        AddEndSlash(Data->Cmd.ExtrPath,ASIZE(Data->Cmd.ExtrPath));
 | 
				
			||||||
        strncpyw(Data->Cmd.DllDestNameW,NullToEmpty(DestNameW),NM-1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (*Data->Cmd.DllDestNameW!=0 && *Data->Cmd.DllDestName==0)
 | 
					 | 
				
			||||||
          WideToChar(Data->Cmd.DllDestNameW,Data->Cmd.DllDestName);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        *Data->Cmd.ExtrPathW=0;
 | 
					 | 
				
			||||||
        *Data->Cmd.DllDestNameW=0;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      strcpy(Data->Cmd.Command,Operation==RAR_EXTRACT ? "X":"T");
 | 
					      if (DestNameW!=NULL)
 | 
				
			||||||
 | 
					        wcsncpyz(Data->Cmd.DllDestName,DestNameW,ASIZE(Data->Cmd.DllDestName));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wcsncpyz(Data->Cmd.Command,Operation==RAR_EXTRACT ? L"X":L"T",ASIZE(Data->Cmd.Command));
 | 
				
			||||||
      Data->Cmd.Test=Operation!=RAR_EXTRACT;
 | 
					      Data->Cmd.Test=Operation!=RAR_EXTRACT;
 | 
				
			||||||
      bool Repeat=false;
 | 
					      bool Repeat=false;
 | 
				
			||||||
      Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat);
 | 
					      Data->Extract.ExtractCurrentFile(Data->Arc,Data->HeaderSize,Repeat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      while (Data->Arc.ReadHeader()!=0 && Data->Arc.GetHeaderType()==NEWSUB_HEAD)
 | 
					      // Now we process extra file information if any.
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					      // Archive can be closed if we process volumes, next volume is missing
 | 
				
			||||||
 | 
					      // and current one is already removed or deleted. So we need to check
 | 
				
			||||||
 | 
					      // if archive is still open to avoid calling file operations on
 | 
				
			||||||
 | 
					      // the invalid file handle. Some of our file operations like Seek()
 | 
				
			||||||
 | 
					      // process such invalid handle correctly, some not.
 | 
				
			||||||
 | 
					      while (Data->Arc.IsOpened() && Data->Arc.ReadHeader()!=0 && 
 | 
				
			||||||
 | 
					             Data->Arc.GetHeaderType()==HEAD_SERVICE)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat);
 | 
					        Data->Extract.ExtractCurrentFile(Data->Arc,Data->HeaderSize,Repeat);
 | 
				
			||||||
        Data->Arc.SeekToNext();
 | 
					        Data->Arc.SeekToNext();
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
 | 
					      Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  catch (int ErrCode)
 | 
					  catch (std::bad_alloc&)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    return(RarErrorToDll(ErrCode));
 | 
					    return ERAR_NO_MEMORY;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(Data->Cmd.DllError);
 | 
					  catch (RAR_EXIT ErrCode)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return Data->Cmd.DllError!=0 ? Data->Cmd.DllError : RarErrorToDll(ErrCode);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return Data->Cmd.DllError;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName)
 | 
					int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return(ProcessFile(hArcData,Operation,DestPath,DestName,NULL,NULL));
 | 
					  return ProcessFile(hArcData,Operation,DestPath,DestName,NULL,NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar *DestPath,wchar *DestName)
 | 
					int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar *DestPath,wchar *DestName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return(ProcessFile(hArcData,Operation,NULL,NULL,DestPath,DestName));
 | 
					  return ProcessFile(hArcData,Operation,NULL,NULL,DestPath,DestName);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -330,40 +450,46 @@ void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataPro
 | 
				
			||||||
  Data->Cmd.ProcessDataProc=ProcessDataProc;
 | 
					  Data->Cmd.ProcessDataProc=ProcessDataProc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef NOCRYPT
 | 
					
 | 
				
			||||||
void PASCAL RARSetPassword(HANDLE hArcData,char *Password)
 | 
					void PASCAL RARSetPassword(HANDLE hArcData,char *Password)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#ifndef RAR_NOCRYPT
 | 
				
			||||||
  DataSet *Data=(DataSet *)hArcData;
 | 
					  DataSet *Data=(DataSet *)hArcData;
 | 
				
			||||||
  strncpyz(Data->Cmd.Password,Password,ASIZE(Data->Cmd.Password));
 | 
					  wchar PasswordW[MAXPASSWORD];
 | 
				
			||||||
}
 | 
					  GetWideName(Password,NULL,PasswordW,ASIZE(PasswordW));
 | 
				
			||||||
 | 
					  Data->Cmd.Password.Set(PasswordW);
 | 
				
			||||||
 | 
					  cleandata(PasswordW,sizeof(PasswordW));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PASCAL RARGetDllVersion()
 | 
					int PASCAL RARGetDllVersion()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return(RAR_DLL_VERSION);
 | 
					  return RAR_DLL_VERSION;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int RarErrorToDll(int ErrCode)
 | 
					static int RarErrorToDll(RAR_EXIT ErrCode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  switch(ErrCode)
 | 
					  switch(ErrCode)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    case FATAL_ERROR:
 | 
					    case RARX_FATAL:
 | 
				
			||||||
      return(ERAR_EREAD);
 | 
					      return ERAR_EREAD;
 | 
				
			||||||
    case CRC_ERROR:
 | 
					    case RARX_CRC:
 | 
				
			||||||
      return(ERAR_BAD_DATA);
 | 
					      return ERAR_BAD_DATA;
 | 
				
			||||||
    case WRITE_ERROR:
 | 
					    case RARX_WRITE:
 | 
				
			||||||
      return(ERAR_EWRITE);
 | 
					      return ERAR_EWRITE;
 | 
				
			||||||
    case OPEN_ERROR:
 | 
					    case RARX_OPEN:
 | 
				
			||||||
      return(ERAR_EOPEN);
 | 
					      return ERAR_EOPEN;
 | 
				
			||||||
    case CREATE_ERROR:
 | 
					    case RARX_CREATE:
 | 
				
			||||||
      return(ERAR_ECREATE);
 | 
					      return ERAR_ECREATE;
 | 
				
			||||||
    case MEMORY_ERROR:
 | 
					    case RARX_MEMORY:
 | 
				
			||||||
      return(ERAR_NO_MEMORY);
 | 
					      return ERAR_NO_MEMORY;
 | 
				
			||||||
    case SUCCESS:
 | 
					    case RARX_BADPWD:
 | 
				
			||||||
      return(0);
 | 
					      return ERAR_BAD_PASSWORD;
 | 
				
			||||||
 | 
					    case RARX_SUCCESS:
 | 
				
			||||||
 | 
					      return ERAR_SUCCESS; // 0.
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      return(ERAR_UNKNOWN);
 | 
					      return ERAR_UNKNOWN;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ EXPORTS
 | 
				
			||||||
  RARReadHeader
 | 
					  RARReadHeader
 | 
				
			||||||
  RARReadHeaderEx
 | 
					  RARReadHeaderEx
 | 
				
			||||||
  RARProcessFile
 | 
					  RARProcessFile
 | 
				
			||||||
 | 
					  RARProcessFileW
 | 
				
			||||||
  RARSetCallback
 | 
					  RARSetCallback
 | 
				
			||||||
  RARSetChangeVolProc
 | 
					  RARSetChangeVolProc
 | 
				
			||||||
  RARSetProcessDataProc
 | 
					  RARSetProcessDataProc
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
#ifndef _UNRAR_DLL_
 | 
					#ifndef _UNRAR_DLL_
 | 
				
			||||||
#define _UNRAR_DLL_
 | 
					#define _UNRAR_DLL_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma pack(push, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ERAR_SUCCESS             0
 | 
				
			||||||
#define ERAR_END_ARCHIVE        10
 | 
					#define ERAR_END_ARCHIVE        10
 | 
				
			||||||
#define ERAR_NO_MEMORY          11
 | 
					#define ERAR_NO_MEMORY          11
 | 
				
			||||||
#define ERAR_BAD_DATA           12
 | 
					#define ERAR_BAD_DATA           12
 | 
				
			||||||
| 
						 | 
					@ -14,6 +17,8 @@
 | 
				
			||||||
#define ERAR_SMALL_BUF          20
 | 
					#define ERAR_SMALL_BUF          20
 | 
				
			||||||
#define ERAR_UNKNOWN            21
 | 
					#define ERAR_UNKNOWN            21
 | 
				
			||||||
#define ERAR_MISSING_PASSWORD   22
 | 
					#define ERAR_MISSING_PASSWORD   22
 | 
				
			||||||
 | 
					#define ERAR_EREFERENCE         23
 | 
				
			||||||
 | 
					#define ERAR_BAD_PASSWORD       24
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RAR_OM_LIST              0
 | 
					#define RAR_OM_LIST              0
 | 
				
			||||||
#define RAR_OM_EXTRACT           1
 | 
					#define RAR_OM_EXTRACT           1
 | 
				
			||||||
| 
						 | 
					@ -26,7 +31,12 @@
 | 
				
			||||||
#define RAR_VOL_ASK           0
 | 
					#define RAR_VOL_ASK           0
 | 
				
			||||||
#define RAR_VOL_NOTIFY        1
 | 
					#define RAR_VOL_NOTIFY        1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RAR_DLL_VERSION       4
 | 
					#define RAR_DLL_VERSION       8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RAR_HASH_NONE         0
 | 
				
			||||||
 | 
					#define RAR_HASH_CRC32        1
 | 
				
			||||||
 | 
					#define RAR_HASH_BLAKE2       2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
#define CALLBACK
 | 
					#define CALLBACK
 | 
				
			||||||
| 
						 | 
					@ -37,6 +47,13 @@
 | 
				
			||||||
#define UINT unsigned int
 | 
					#define UINT unsigned int
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RHDF_SPLITBEFORE 0x01
 | 
				
			||||||
 | 
					#define RHDF_SPLITAFTER  0x02
 | 
				
			||||||
 | 
					#define RHDF_ENCRYPTED   0x04
 | 
				
			||||||
 | 
					#define RHDF_SOLID       0x10
 | 
				
			||||||
 | 
					#define RHDF_DIRECTORY   0x20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct RARHeaderData
 | 
					struct RARHeaderData
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char         ArcName[260];
 | 
					  char         ArcName[260];
 | 
				
			||||||
| 
						 | 
					@ -78,7 +95,20 @@ struct RARHeaderDataEx
 | 
				
			||||||
  unsigned int CmtBufSize;
 | 
					  unsigned int CmtBufSize;
 | 
				
			||||||
  unsigned int CmtSize;
 | 
					  unsigned int CmtSize;
 | 
				
			||||||
  unsigned int CmtState;
 | 
					  unsigned int CmtState;
 | 
				
			||||||
  unsigned int Reserved[1024];
 | 
					  unsigned int DictSize;
 | 
				
			||||||
 | 
					  unsigned int HashType;
 | 
				
			||||||
 | 
					  char         Hash[32];
 | 
				
			||||||
 | 
					  unsigned int RedirType;
 | 
				
			||||||
 | 
					  wchar_t      *RedirName;
 | 
				
			||||||
 | 
					  unsigned int RedirNameSize;
 | 
				
			||||||
 | 
					  unsigned int DirTarget;
 | 
				
			||||||
 | 
					  unsigned int MtimeLow;
 | 
				
			||||||
 | 
					  unsigned int MtimeHigh;
 | 
				
			||||||
 | 
					  unsigned int CtimeLow;
 | 
				
			||||||
 | 
					  unsigned int CtimeHigh;
 | 
				
			||||||
 | 
					  unsigned int AtimeLow;
 | 
				
			||||||
 | 
					  unsigned int AtimeHigh;
 | 
				
			||||||
 | 
					  unsigned int Reserved[988];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,26 +123,43 @@ struct RAROpenArchiveData
 | 
				
			||||||
  unsigned int CmtState;
 | 
					  unsigned int CmtState;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ROADF_VOLUME       0x0001
 | 
				
			||||||
 | 
					#define ROADF_COMMENT      0x0002
 | 
				
			||||||
 | 
					#define ROADF_LOCK         0x0004
 | 
				
			||||||
 | 
					#define ROADF_SOLID        0x0008
 | 
				
			||||||
 | 
					#define ROADF_NEWNUMBERING 0x0010
 | 
				
			||||||
 | 
					#define ROADF_SIGNED       0x0020
 | 
				
			||||||
 | 
					#define ROADF_RECOVERY     0x0040
 | 
				
			||||||
 | 
					#define ROADF_ENCHEADERS   0x0080
 | 
				
			||||||
 | 
					#define ROADF_FIRSTVOLUME  0x0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ROADOF_KEEPBROKEN  0x0001
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct RAROpenArchiveDataEx
 | 
					struct RAROpenArchiveDataEx
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char         *ArcName;
 | 
					  char         *ArcName;
 | 
				
			||||||
  wchar_t      *ArcNameW;
 | 
					  wchar_t      *ArcNameW;
 | 
				
			||||||
  unsigned int OpenMode;
 | 
					  unsigned int  OpenMode;
 | 
				
			||||||
  unsigned int OpenResult;
 | 
					  unsigned int  OpenResult;
 | 
				
			||||||
  char         *CmtBuf;
 | 
					  char         *CmtBuf;
 | 
				
			||||||
  unsigned int CmtBufSize;
 | 
					  unsigned int  CmtBufSize;
 | 
				
			||||||
  unsigned int CmtSize;
 | 
					  unsigned int  CmtSize;
 | 
				
			||||||
  unsigned int CmtState;
 | 
					  unsigned int  CmtState;
 | 
				
			||||||
  unsigned int Flags;
 | 
					  unsigned int  Flags;
 | 
				
			||||||
  unsigned int Reserved[32];
 | 
					  UNRARCALLBACK Callback;
 | 
				
			||||||
 | 
					  LPARAM        UserData;
 | 
				
			||||||
 | 
					  unsigned int  OpFlags;
 | 
				
			||||||
 | 
					  wchar_t      *CmtBufW;
 | 
				
			||||||
 | 
					  unsigned int  Reserved[25];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum UNRARCALLBACK_MESSAGES {
 | 
					enum UNRARCALLBACK_MESSAGES {
 | 
				
			||||||
  UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD
 | 
					  UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD,UCM_CHANGEVOLUMEW,
 | 
				
			||||||
 | 
					  UCM_NEEDPASSWORDW
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode);
 | 
					typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode);
 | 
				
			||||||
typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size);
 | 
					typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -137,4 +184,6 @@ int    PASCAL RARGetDllVersion();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma pack(pop)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					#include <commctrl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VS_VERSION_INFO VERSIONINFO
 | 
				
			||||||
 | 
					FILEVERSION 5, 91, 100, 3470
 | 
				
			||||||
 | 
					PRODUCTVERSION 5, 91, 100, 3470
 | 
				
			||||||
 | 
					FILEOS VOS__WINDOWS32
 | 
				
			||||||
 | 
					FILETYPE VFT_APP
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  BLOCK "StringFileInfo"
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    BLOCK "040904E4"
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      VALUE "CompanyName", "Alexander Roshal\0"
 | 
				
			||||||
 | 
					      VALUE "ProductName", "RAR decompression library\0"
 | 
				
			||||||
 | 
					      VALUE "FileDescription", "RAR decompression library\0"
 | 
				
			||||||
 | 
					      VALUE "FileVersion", "5.91.0\0"
 | 
				
			||||||
 | 
					      VALUE "ProductVersion", "5.91.0\0"
 | 
				
			||||||
 | 
					      VALUE "LegalCopyright", "Copyright © Alexander Roshal 1993-2020\0"
 | 
				
			||||||
 | 
					      VALUE "OriginalFilename", "Unrar.dll\0"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  BLOCK "VarFileInfo"
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    VALUE "Translation", 0x0409, 0x04E4
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					EXPORTS
 | 
				
			||||||
 | 
					  RAROpenArchive
 | 
				
			||||||
 | 
					  RAROpenArchiveEx
 | 
				
			||||||
 | 
					  RARCloseArchive
 | 
				
			||||||
 | 
					  RARReadHeader
 | 
				
			||||||
 | 
					  RARReadHeaderEx
 | 
				
			||||||
 | 
					  RARProcessFile
 | 
				
			||||||
 | 
					  RARProcessFileW
 | 
				
			||||||
 | 
					  RARSetCallback
 | 
				
			||||||
 | 
					  RARSetChangeVolProc
 | 
				
			||||||
 | 
					  RARSetProcessDataProc
 | 
				
			||||||
 | 
					;  RARSetPassword
 | 
				
			||||||
 | 
					  RARGetDllVersion
 | 
				
			||||||
| 
						 | 
					@ -11,41 +11,53 @@ EncodeFileName::EncodeFileName()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void EncodeFileName::Decode(char *Name,byte *EncName,size_t EncSize,wchar *NameW,
 | 
					void EncodeFileName::Decode(char *Name,size_t NameSize,byte *EncName,size_t EncSize,
 | 
				
			||||||
                            size_t MaxDecSize)
 | 
					                            wchar *NameW,size_t MaxDecSize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  size_t EncPos=0,DecPos=0;
 | 
					  size_t EncPos=0,DecPos=0;
 | 
				
			||||||
  byte HighByte=EncName[EncPos++];
 | 
					  byte HighByte=EncPos<EncSize ? EncName[EncPos++] : 0;
 | 
				
			||||||
  while (EncPos<EncSize && DecPos<MaxDecSize)
 | 
					  while (EncPos<EncSize && DecPos<MaxDecSize)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (FlagBits==0)
 | 
					    if (FlagBits==0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					      if (EncPos>=EncSize)
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
      Flags=EncName[EncPos++];
 | 
					      Flags=EncName[EncPos++];
 | 
				
			||||||
      FlagBits=8;
 | 
					      FlagBits=8;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    switch(Flags>>6)
 | 
					    switch(Flags>>6)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      case 0:
 | 
					      case 0:
 | 
				
			||||||
 | 
					        if (EncPos>=EncSize)
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
        NameW[DecPos++]=EncName[EncPos++];
 | 
					        NameW[DecPos++]=EncName[EncPos++];
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case 1:
 | 
					      case 1:
 | 
				
			||||||
 | 
					        if (EncPos>=EncSize)
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
        NameW[DecPos++]=EncName[EncPos++]+(HighByte<<8);
 | 
					        NameW[DecPos++]=EncName[EncPos++]+(HighByte<<8);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case 2:
 | 
					      case 2:
 | 
				
			||||||
 | 
					        if (EncPos+1>=EncSize)
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
        NameW[DecPos++]=EncName[EncPos]+(EncName[EncPos+1]<<8);
 | 
					        NameW[DecPos++]=EncName[EncPos]+(EncName[EncPos+1]<<8);
 | 
				
			||||||
        EncPos+=2;
 | 
					        EncPos+=2;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case 3:
 | 
					      case 3:
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					          if (EncPos>=EncSize)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
          int Length=EncName[EncPos++];
 | 
					          int Length=EncName[EncPos++];
 | 
				
			||||||
          if (Length & 0x80)
 | 
					          if ((Length & 0x80)!=0)
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
 | 
					            if (EncPos>=EncSize)
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
            byte Correction=EncName[EncPos++];
 | 
					            byte Correction=EncName[EncPos++];
 | 
				
			||||||
            for (Length=(Length&0x7f)+2;Length>0 && DecPos<MaxDecSize;Length--,DecPos++)
 | 
					            for (Length=(Length&0x7f)+2;Length>0 && DecPos<MaxDecSize && DecPos<NameSize;Length--,DecPos++)
 | 
				
			||||||
              NameW[DecPos]=((Name[DecPos]+Correction)&0xff)+(HighByte<<8);
 | 
					              NameW[DecPos]=((Name[DecPos]+Correction)&0xff)+(HighByte<<8);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
            for (Length+=2;Length>0 && DecPos<MaxDecSize;Length--,DecPos++)
 | 
					            for (Length+=2;Length>0 && DecPos<MaxDecSize && DecPos<NameSize;Length--,DecPos++)
 | 
				
			||||||
              NameW[DecPos]=Name[DecPos];
 | 
					              NameW[DecPos]=Name[DecPos];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ class EncodeFileName
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    EncodeFileName();
 | 
					    EncodeFileName();
 | 
				
			||||||
    size_t Encode(char *Name,wchar *NameW,byte *EncName);
 | 
					    size_t Encode(char *Name,wchar *NameW,byte *EncName);
 | 
				
			||||||
    void Decode(char *Name,byte *EncName,size_t EncSize,wchar *NameW,size_t MaxDecSize);
 | 
					    void Decode(char *Name,size_t NameSize,byte *EncName,size_t EncSize,wchar *NameW,size_t MaxDecSize);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,5 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool UserBreak;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ErrorHandler::ErrorHandler()
 | 
					ErrorHandler::ErrorHandler()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Clean();
 | 
					  Clean();
 | 
				
			||||||
| 
						 | 
					@ -11,252 +8,243 @@ ErrorHandler::ErrorHandler()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::Clean()
 | 
					void ErrorHandler::Clean()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ExitCode=SUCCESS;
 | 
					  ExitCode=RARX_SUCCESS;
 | 
				
			||||||
  ErrCount=0;
 | 
					  ErrCount=0;
 | 
				
			||||||
  EnableBreak=true;
 | 
					  EnableBreak=true;
 | 
				
			||||||
  Silent=false;
 | 
					  Silent=false;
 | 
				
			||||||
  DoShutdown=false;
 | 
					  UserBreak=false;
 | 
				
			||||||
 | 
					  MainExit=false;
 | 
				
			||||||
 | 
					  DisableShutdown=false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::MemoryError()
 | 
					void ErrorHandler::MemoryError()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  MemoryErrorMsg();
 | 
					  MemoryErrorMsg();
 | 
				
			||||||
  Throw(MEMORY_ERROR);
 | 
					  Exit(RARX_MEMORY);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::OpenError(const char *FileName)
 | 
					void ErrorHandler::OpenError(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					#ifndef SILENT
 | 
				
			||||||
  OpenErrorMsg(FileName);
 | 
					  OpenErrorMsg(FileName);
 | 
				
			||||||
  Throw(OPEN_ERROR);
 | 
					  Exit(RARX_OPEN);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::CloseError(const char *FileName)
 | 
					void ErrorHandler::CloseError(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					 | 
				
			||||||
  if (!UserBreak)
 | 
					  if (!UserBreak)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    ErrMsg(NULL,St(MErrFClose),FileName);
 | 
					    uiMsg(UIERROR_FILECLOSE,FileName);
 | 
				
			||||||
    SysErrMsg();
 | 
					    SysErrMsg();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					  // We must not call Exit and throw an exception here, because this function
 | 
				
			||||||
#if !defined(SILENT) || defined(RARDLL)
 | 
					  // is called from File object destructor and can be invoked when stack
 | 
				
			||||||
  Throw(FATAL_ERROR);
 | 
					  // unwinding while handling another exception. Throwing a new exception
 | 
				
			||||||
#endif
 | 
					  // when stack unwinding is prohibited and terminates a program.
 | 
				
			||||||
 | 
					  // If necessary, we can check std::uncaught_exception() before throw.
 | 
				
			||||||
 | 
					  SetErrorCode(RARX_FATAL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::ReadError(const char *FileName)
 | 
					void ErrorHandler::ReadError(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					#ifndef SILENT
 | 
				
			||||||
  ReadErrorMsg(NULL,FileName);
 | 
					  ReadErrorMsg(FileName);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if !defined(SILENT) || defined(RARDLL)
 | 
					#if !defined(SILENT) || defined(RARDLL)
 | 
				
			||||||
  Throw(FATAL_ERROR);
 | 
					  Exit(RARX_FATAL);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool ErrorHandler::AskRepeatRead(const char *FileName)
 | 
					bool ErrorHandler::AskRepeatRead(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if !defined(SILENT) && !defined(SFX_MODULE) && !defined(_WIN_CE)
 | 
					#if !defined(SILENT) && !defined(SFX_MODULE)
 | 
				
			||||||
  if (!Silent)
 | 
					  if (!Silent)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    SysErrMsg();
 | 
					    SysErrMsg();
 | 
				
			||||||
    mprintf("\n");
 | 
					    bool Repeat=uiAskRepeatRead(FileName);
 | 
				
			||||||
    Log(NULL,St(MErrRead),FileName);
 | 
					    if (!Repeat) // Disable shutdown if user pressed Cancel in error dialog.
 | 
				
			||||||
    return(Ask(St(MRetryAbort))==1);
 | 
					      DisableShutdown=true;
 | 
				
			||||||
 | 
					    return Repeat;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  return(false);
 | 
					  return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::WriteError(const char *ArcName,const char *FileName)
 | 
					void ErrorHandler::WriteError(const wchar *ArcName,const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					#ifndef SILENT
 | 
				
			||||||
  WriteErrorMsg(ArcName,FileName);
 | 
					  WriteErrorMsg(ArcName,FileName);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if !defined(SILENT) || defined(RARDLL)
 | 
					#if !defined(SILENT) || defined(RARDLL)
 | 
				
			||||||
  Throw(WRITE_ERROR);
 | 
					  Exit(RARX_WRITE);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
void ErrorHandler::WriteErrorFAT(const char *FileName)
 | 
					void ErrorHandler::WriteErrorFAT(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if !defined(SILENT) && !defined(SFX_MODULE)
 | 
					 | 
				
			||||||
  SysErrMsg();
 | 
					  SysErrMsg();
 | 
				
			||||||
  ErrMsg(NULL,St(MNTFSRequired),FileName);
 | 
					  uiMsg(UIERROR_NTFSREQUIRED,FileName);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(SILENT) && !defined(SFX_MODULE) || defined(RARDLL)
 | 
					#if !defined(SILENT) && !defined(SFX_MODULE) || defined(RARDLL)
 | 
				
			||||||
  Throw(WRITE_ERROR);
 | 
					  Exit(RARX_WRITE);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool ErrorHandler::AskRepeatWrite(const char *FileName,bool DiskFull)
 | 
					bool ErrorHandler::AskRepeatWrite(const wchar *FileName,bool DiskFull)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if !defined(SILENT) && !defined(_WIN_CE)
 | 
					#ifndef SILENT
 | 
				
			||||||
  if (!Silent)
 | 
					  if (!Silent)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    // We do not display "repeat write" prompt in Android, so we do not
 | 
				
			||||||
 | 
					    // need the matching system error message.
 | 
				
			||||||
    SysErrMsg();
 | 
					    SysErrMsg();
 | 
				
			||||||
    mprintf("\n");
 | 
					    bool Repeat=uiAskRepeatWrite(FileName,DiskFull);
 | 
				
			||||||
    Log(NULL,St(DiskFull ? MNotEnoughDisk:MErrWrite),FileName);
 | 
					    if (!Repeat) // Disable shutdown if user pressed Cancel in error dialog.
 | 
				
			||||||
    return(Ask(St(MRetryAbort))==1);
 | 
					      DisableShutdown=true;
 | 
				
			||||||
 | 
					    return Repeat;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  return(false);
 | 
					  return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::SeekError(const char *FileName)
 | 
					void ErrorHandler::SeekError(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					 | 
				
			||||||
  if (!UserBreak)
 | 
					  if (!UserBreak)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    ErrMsg(NULL,St(MErrSeek),FileName);
 | 
					    uiMsg(UIERROR_FILESEEK,FileName);
 | 
				
			||||||
    SysErrMsg();
 | 
					    SysErrMsg();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(SILENT) || defined(RARDLL)
 | 
					#if !defined(SILENT) || defined(RARDLL)
 | 
				
			||||||
  Throw(FATAL_ERROR);
 | 
					  Exit(RARX_FATAL);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::GeneralErrMsg(const char *Msg)
 | 
					void ErrorHandler::GeneralErrMsg(const wchar *fmt,...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					  va_list arglist;
 | 
				
			||||||
  Log(NULL,"%s",Msg);
 | 
					  va_start(arglist,fmt);
 | 
				
			||||||
 | 
					  wchar Msg[1024];
 | 
				
			||||||
 | 
					  vswprintf(Msg,ASIZE(Msg),fmt,arglist);
 | 
				
			||||||
 | 
					  uiMsg(UIERROR_GENERALERRMSG,Msg);
 | 
				
			||||||
  SysErrMsg();
 | 
					  SysErrMsg();
 | 
				
			||||||
#endif
 | 
					  va_end(arglist);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::MemoryErrorMsg()
 | 
					void ErrorHandler::MemoryErrorMsg()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					  uiMsg(UIERROR_MEMORY);
 | 
				
			||||||
  ErrMsg(NULL,St(MErrOutMem));
 | 
					  SetErrorCode(RARX_MEMORY);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::OpenErrorMsg(const char *FileName)
 | 
					void ErrorHandler::OpenErrorMsg(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  OpenErrorMsg(NULL,FileName);
 | 
					  OpenErrorMsg(NULL,FileName);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::OpenErrorMsg(const char *ArcName,const char *FileName)
 | 
					void ErrorHandler::OpenErrorMsg(const wchar *ArcName,const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					  Wait(); // Keep GUI responsive if many files cannot be opened when archiving.
 | 
				
			||||||
  Log(ArcName && *ArcName ? ArcName:NULL,St(MCannotOpen),FileName);
 | 
					  uiMsg(UIERROR_FILEOPEN,ArcName,FileName);
 | 
				
			||||||
  Alarm();
 | 
					 | 
				
			||||||
  SysErrMsg();
 | 
					  SysErrMsg();
 | 
				
			||||||
#endif
 | 
					  SetErrorCode(RARX_OPEN);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::CreateErrorMsg(const char *FileName)
 | 
					void ErrorHandler::CreateErrorMsg(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CreateErrorMsg(NULL,FileName);
 | 
					  CreateErrorMsg(NULL,FileName);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::CreateErrorMsg(const char *ArcName,const char *FileName)
 | 
					void ErrorHandler::CreateErrorMsg(const wchar *ArcName,const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					  uiMsg(UIERROR_FILECREATE,ArcName,FileName);
 | 
				
			||||||
  Log(ArcName && *ArcName ? ArcName:NULL,St(MCannotCreate),FileName);
 | 
					 | 
				
			||||||
  Alarm();
 | 
					 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE) && !defined(SFX_MODULE) && defined(MAX_PATH)
 | 
					 | 
				
			||||||
  if (GetLastError()==ERROR_PATH_NOT_FOUND)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    size_t NameLength=strlen(FileName);
 | 
					 | 
				
			||||||
    if (!IsFullPath(FileName))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      char CurDir[NM];
 | 
					 | 
				
			||||||
      GetCurrentDirectory(sizeof(CurDir),CurDir);
 | 
					 | 
				
			||||||
      NameLength+=strlen(CurDir)+1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (NameLength>MAX_PATH)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      Log(ArcName && *ArcName ? ArcName:NULL,St(MMaxPathLimit),MAX_PATH);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  SysErrMsg();
 | 
					  SysErrMsg();
 | 
				
			||||||
#endif
 | 
					  SetErrorCode(RARX_CREATE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::ReadErrorMsg(const char *ArcName,const char *FileName)
 | 
					void ErrorHandler::ReadErrorMsg(const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					  ReadErrorMsg(NULL,FileName);
 | 
				
			||||||
  ErrMsg(ArcName,St(MErrRead),FileName);
 | 
					 | 
				
			||||||
  SysErrMsg();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::WriteErrorMsg(const char *ArcName,const char *FileName)
 | 
					void ErrorHandler::ReadErrorMsg(const wchar *ArcName,const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SILENT
 | 
					  uiMsg(UIERROR_FILEREAD,ArcName,FileName);
 | 
				
			||||||
  ErrMsg(ArcName,St(MErrWrite),FileName);
 | 
					 | 
				
			||||||
  SysErrMsg();
 | 
					  SysErrMsg();
 | 
				
			||||||
#endif
 | 
					  SetErrorCode(RARX_FATAL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::Exit(int ExitCode)
 | 
					void ErrorHandler::WriteErrorMsg(const wchar *ArcName,const wchar *FileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					  uiMsg(UIERROR_FILEWRITE,ArcName,FileName);
 | 
				
			||||||
  Alarm();
 | 
					  SysErrMsg();
 | 
				
			||||||
#endif
 | 
					  SetErrorCode(RARX_WRITE);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ErrorHandler::ArcBrokenMsg(const wchar *ArcName)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uiMsg(UIERROR_ARCBROKEN,ArcName);
 | 
				
			||||||
 | 
					  SetErrorCode(RARX_CRC);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ErrorHandler::ChecksumFailedMsg(const wchar *ArcName,const wchar *FileName)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uiMsg(UIERROR_CHECKSUM,ArcName,FileName);
 | 
				
			||||||
 | 
					  SetErrorCode(RARX_CRC);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ErrorHandler::UnknownMethodMsg(const wchar *ArcName,const wchar *FileName)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uiMsg(UIERROR_UNKNOWNMETHOD,ArcName,FileName);
 | 
				
			||||||
 | 
					  ErrHandler.SetErrorCode(RARX_FATAL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ErrorHandler::Exit(RAR_EXIT ExitCode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uiAlarm(UIALARM_ERROR);
 | 
				
			||||||
  Throw(ExitCode);
 | 
					  Throw(ExitCode);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef GUI
 | 
					void ErrorHandler::SetErrorCode(RAR_EXIT Code)
 | 
				
			||||||
void ErrorHandler::ErrMsg(const char *ArcName,const char *fmt,...)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  safebuf char Msg[NM+1024];
 | 
					 | 
				
			||||||
  va_list argptr;
 | 
					 | 
				
			||||||
  va_start(argptr,fmt);
 | 
					 | 
				
			||||||
  vsprintf(Msg,fmt,argptr);
 | 
					 | 
				
			||||||
  va_end(argptr);
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  if (UserBreak)
 | 
					 | 
				
			||||||
    Sleep(5000);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  Alarm();
 | 
					 | 
				
			||||||
  if (*Msg)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(ArcName,"\n%s",Msg);
 | 
					 | 
				
			||||||
    mprintf("\n%s\n",St(MProgAborted));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ErrorHandler::SetErrorCode(int Code)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  switch(Code)
 | 
					  switch(Code)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    case WARNING:
 | 
					    case RARX_WARNING:
 | 
				
			||||||
    case USER_BREAK:
 | 
					    case RARX_USERBREAK:
 | 
				
			||||||
      if (ExitCode==SUCCESS)
 | 
					      if (ExitCode==RARX_SUCCESS)
 | 
				
			||||||
        ExitCode=Code;
 | 
					        ExitCode=Code;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case FATAL_ERROR:
 | 
					    case RARX_CRC:
 | 
				
			||||||
      if (ExitCode==SUCCESS || ExitCode==WARNING)
 | 
					      if (ExitCode!=RARX_BADPWD)
 | 
				
			||||||
        ExitCode=FATAL_ERROR;
 | 
					        ExitCode=Code;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case RARX_FATAL:
 | 
				
			||||||
 | 
					      if (ExitCode==RARX_SUCCESS || ExitCode==RARX_WARNING)
 | 
				
			||||||
 | 
					        ExitCode=RARX_FATAL;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      ExitCode=Code;
 | 
					      ExitCode=Code;
 | 
				
			||||||
| 
						 | 
					@ -266,8 +254,7 @@ void ErrorHandler::SetErrorCode(int Code)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(GUI) && !defined(_SFX_RTL_)
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
BOOL __stdcall ProcessSignal(DWORD SigType)
 | 
					BOOL __stdcall ProcessSignal(DWORD SigType)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#if defined(__sun)
 | 
					#if defined(__sun)
 | 
				
			||||||
| 
						 | 
					@ -276,102 +263,147 @@ extern "C"
 | 
				
			||||||
void _stdfunction ProcessSignal(int SigType)
 | 
					void _stdfunction ProcessSignal(int SigType)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  // When a console application is run as a service, this allows the service
 | 
				
			||||||
 | 
					  // to continue running after the user logs off. 
 | 
				
			||||||
  if (SigType==CTRL_LOGOFF_EVENT)
 | 
					  if (SigType==CTRL_LOGOFF_EVENT)
 | 
				
			||||||
    return(TRUE);
 | 
					    return TRUE;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  UserBreak=true;
 | 
					
 | 
				
			||||||
 | 
					  ErrHandler.UserBreak=true;
 | 
				
			||||||
 | 
					  ErrHandler.SetDisableShutdown();
 | 
				
			||||||
  mprintf(St(MBreak));
 | 
					  mprintf(St(MBreak));
 | 
				
			||||||
  for (int I=0;!File::RemoveCreated() && I<3;I++)
 | 
					
 | 
				
			||||||
  {
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  // Let the main thread to handle 'throw' and destroy file objects.
 | 
				
			||||||
 | 
					  for (uint I=0;!ErrHandler.MainExit && I<50;I++)
 | 
				
			||||||
    Sleep(100);
 | 
					    Sleep(100);
 | 
				
			||||||
#endif
 | 
					#if defined(USE_RC) && !defined(SFX_MODULE) && !defined(RARDLL)
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#if defined(USE_RC) && !defined(SFX_MODULE) && !defined(_WIN_CE)
 | 
					 | 
				
			||||||
  ExtRes.UnloadDLL();
 | 
					  ExtRes.UnloadDLL();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  exit(USER_BREAK);
 | 
					  exit(RARX_USERBREAK);
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_MSC_VER)
 | 
					#endif
 | 
				
			||||||
  // never reached, just to avoid a compiler warning
 | 
					
 | 
				
			||||||
  return(TRUE);
 | 
					#ifdef _UNIX
 | 
				
			||||||
 | 
					  static uint BreakCount=0;
 | 
				
			||||||
 | 
					  // User continues to press Ctrl+C, exit immediately without cleanup.
 | 
				
			||||||
 | 
					  if (++BreakCount>1)
 | 
				
			||||||
 | 
					    exit(RARX_USERBREAK);
 | 
				
			||||||
 | 
					  // Otherwise return from signal handler and let Wait() function to close
 | 
				
			||||||
 | 
					  // files and quit. We cannot use the same approach as in Windows,
 | 
				
			||||||
 | 
					  // because Unix signal handler can block execution of our main code.
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) && !defined(_MSC_VER)
 | 
				
			||||||
 | 
					  // Never reached, just to avoid a compiler warning
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::SetSignalHandlers(bool Enable)
 | 
					void ErrorHandler::SetSignalHandlers(bool Enable)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EnableBreak=Enable;
 | 
					  EnableBreak=Enable;
 | 
				
			||||||
#if !defined(GUI) && !defined(_SFX_RTL_)
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  SetConsoleCtrlHandler(Enable ? ProcessSignal:NULL,TRUE);
 | 
					  SetConsoleCtrlHandler(Enable ? ProcessSignal:NULL,TRUE);
 | 
				
			||||||
//  signal(SIGBREAK,Enable ? ProcessSignal:SIG_IGN);
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  signal(SIGINT,Enable ? ProcessSignal:SIG_IGN);
 | 
					  signal(SIGINT,Enable ? ProcessSignal:SIG_IGN);
 | 
				
			||||||
  signal(SIGTERM,Enable ? ProcessSignal:SIG_IGN);
 | 
					  signal(SIGTERM,Enable ? ProcessSignal:SIG_IGN);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::Throw(int Code)
 | 
					void ErrorHandler::Throw(RAR_EXIT Code)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Code==USER_BREAK && !EnableBreak)
 | 
					  if (Code==RARX_USERBREAK && !EnableBreak)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  ErrHandler.SetErrorCode(Code);
 | 
					#if !defined(SILENT)
 | 
				
			||||||
#ifdef ALLOW_EXCEPTIONS
 | 
					  // Do not write "aborted" when just displaying online help.
 | 
				
			||||||
  throw Code;
 | 
					  if (Code!=RARX_SUCCESS && Code!=RARX_USERERROR)
 | 
				
			||||||
#else
 | 
					    mprintf(L"\n%s\n",St(MProgAborted));
 | 
				
			||||||
  File::RemoveCreated();
 | 
					 | 
				
			||||||
  exit(Code);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					  SetErrorCode(Code);
 | 
				
			||||||
 | 
					  throw Code;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool ErrorHandler::GetSysErrMsg(wchar *Msg,size_t Size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifndef SILENT
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  int ErrType=GetLastError();
 | 
				
			||||||
 | 
					  if (ErrType!=0)
 | 
				
			||||||
 | 
					    return FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
 | 
				
			||||||
 | 
					                         NULL,ErrType,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
 | 
				
			||||||
 | 
					                         Msg,(DWORD)Size,NULL)!=0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_UNIX) || defined(_EMX)
 | 
				
			||||||
 | 
					  if (errno!=0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char *err=strerror(errno);
 | 
				
			||||||
 | 
					    if (err!=NULL)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      CharToWide(err,Msg,Size);
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ErrorHandler::SysErrMsg()
 | 
					void ErrorHandler::SysErrMsg()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if !defined(SFX_MODULE) && !defined(SILENT)
 | 
					#if !defined(SFX_MODULE) && !defined(SILENT)
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  wchar Msg[1024];
 | 
				
			||||||
    #define STRCHR strchr
 | 
					  if (!GetSysErrMsg(Msg,ASIZE(Msg)))
 | 
				
			||||||
    #define ERRCHAR char
 | 
					    return;
 | 
				
			||||||
  ERRCHAR  *lpMsgBuf=NULL;
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  int ErrType=GetLastError();
 | 
					  wchar *CurMsg=Msg;
 | 
				
			||||||
  if (ErrType!=0 && FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
 | 
					  while (CurMsg!=NULL) // Print string with \r\n as several strings to multiple lines.
 | 
				
			||||||
              NULL,ErrType,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
 | 
					 | 
				
			||||||
              (LPTSTR)&lpMsgBuf,0,NULL))
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    ERRCHAR  *CurMsg=lpMsgBuf;
 | 
					    while (*CurMsg=='\r' || *CurMsg=='\n')
 | 
				
			||||||
    while (CurMsg!=NULL)
 | 
					      CurMsg++;
 | 
				
			||||||
 | 
					    if (*CurMsg==0)
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    wchar *EndMsg=wcschr(CurMsg,'\r');
 | 
				
			||||||
 | 
					    if (EndMsg==NULL)
 | 
				
			||||||
 | 
					      EndMsg=wcschr(CurMsg,'\n');
 | 
				
			||||||
 | 
					    if (EndMsg!=NULL)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      while (*CurMsg=='\r' || *CurMsg=='\n')
 | 
					      *EndMsg=0;
 | 
				
			||||||
        CurMsg++;
 | 
					      EndMsg++;
 | 
				
			||||||
      if (*CurMsg==0)
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      ERRCHAR *EndMsg=STRCHR(CurMsg,'\r');
 | 
					 | 
				
			||||||
      if (EndMsg==NULL)
 | 
					 | 
				
			||||||
        EndMsg=STRCHR(CurMsg,'\n');
 | 
					 | 
				
			||||||
      if (EndMsg!=NULL)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        *EndMsg=0;
 | 
					 | 
				
			||||||
        EndMsg++;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      Log(NULL,"\n%s",CurMsg);
 | 
					 | 
				
			||||||
      CurMsg=EndMsg;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    uiMsg(UIERROR_SYSERRMSG,CurMsg);
 | 
				
			||||||
 | 
					    CurMsg=EndMsg;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  LocalFree( lpMsgBuf );
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_UNIX) || defined(_EMX)
 | 
					#if defined(_UNIX) || defined(_EMX)
 | 
				
			||||||
  char *err=strerror(errno);
 | 
					  uiMsg(UIERROR_SYSERRMSG,Msg);
 | 
				
			||||||
  if (err!=NULL)
 | 
					 | 
				
			||||||
    Log(NULL,"\n%s",err);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ErrorHandler::GetSystemErrorCode()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  return GetLastError();
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  return errno;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ErrorHandler::SetSystemErrorCode(int Code)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  SetLastError(Code);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  errno=Code;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,63 +1,72 @@
 | 
				
			||||||
#ifndef _RAR_ERRHANDLER_
 | 
					#ifndef _RAR_ERRHANDLER_
 | 
				
			||||||
#define _RAR_ERRHANDLER_
 | 
					#define _RAR_ERRHANDLER_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (defined(GUI) || !defined(_WIN_32)) && !defined(SFX_MODULE) && !defined(_WIN_CE) || defined(RARDLL)
 | 
					enum RAR_EXIT // RAR exit code.
 | 
				
			||||||
#define ALLOW_EXCEPTIONS
 | 
					{ 
 | 
				
			||||||
#endif
 | 
					  RARX_SUCCESS   =   0,
 | 
				
			||||||
 | 
					  RARX_WARNING   =   1,
 | 
				
			||||||
 | 
					  RARX_FATAL     =   2,
 | 
				
			||||||
 | 
					  RARX_CRC       =   3,
 | 
				
			||||||
#define rarmalloc malloc
 | 
					  RARX_LOCK      =   4,
 | 
				
			||||||
#define rarcalloc calloc
 | 
					  RARX_WRITE     =   5,
 | 
				
			||||||
#define rarrealloc realloc
 | 
					  RARX_OPEN      =   6,
 | 
				
			||||||
#define rarfree free
 | 
					  RARX_USERERROR =   7,
 | 
				
			||||||
#define rarstrdup strdup
 | 
					  RARX_MEMORY    =   8,
 | 
				
			||||||
#define rarstrdupw strdupw
 | 
					  RARX_CREATE    =   9,
 | 
				
			||||||
 | 
					  RARX_NOFILES   =  10,
 | 
				
			||||||
 | 
					  RARX_BADPWD    =  11,
 | 
				
			||||||
 | 
					  RARX_USERBREAK = 255
 | 
				
			||||||
enum { SUCCESS,WARNING,FATAL_ERROR,CRC_ERROR,LOCK_ERROR,WRITE_ERROR,
 | 
					};
 | 
				
			||||||
       OPEN_ERROR,USER_ERROR,MEMORY_ERROR,CREATE_ERROR,USER_BREAK=255};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ErrorHandler
 | 
					class ErrorHandler
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    void ErrMsg(const char *ArcName,const char *fmt,...);
 | 
					    RAR_EXIT ExitCode;
 | 
				
			||||||
 | 
					    uint ErrCount;
 | 
				
			||||||
    int ExitCode;
 | 
					 | 
				
			||||||
    int ErrCount;
 | 
					 | 
				
			||||||
    bool EnableBreak;
 | 
					    bool EnableBreak;
 | 
				
			||||||
    bool Silent;
 | 
					    bool Silent;
 | 
				
			||||||
    bool DoShutdown;
 | 
					    bool DisableShutdown; // Shutdown is not suitable after last error.
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    ErrorHandler();
 | 
					    ErrorHandler();
 | 
				
			||||||
    void Clean();
 | 
					    void Clean();
 | 
				
			||||||
    void MemoryError();
 | 
					    void MemoryError();
 | 
				
			||||||
    void OpenError(const char *FileName);
 | 
					    void OpenError(const wchar *FileName);
 | 
				
			||||||
    void CloseError(const char *FileName);
 | 
					    void CloseError(const wchar *FileName);
 | 
				
			||||||
    void ReadError(const char *FileName);
 | 
					    void ReadError(const wchar *FileName);
 | 
				
			||||||
    bool AskRepeatRead(const char *FileName);
 | 
					    bool AskRepeatRead(const wchar *FileName);
 | 
				
			||||||
    void WriteError(const char *ArcName,const char *FileName);
 | 
					    void WriteError(const wchar *ArcName,const wchar *FileName);
 | 
				
			||||||
    void WriteErrorFAT(const char *FileName);
 | 
					    void WriteErrorFAT(const wchar *FileName);
 | 
				
			||||||
    bool AskRepeatWrite(const char *FileName,bool DiskFull);
 | 
					    bool AskRepeatWrite(const wchar *FileName,bool DiskFull);
 | 
				
			||||||
    void SeekError(const char *FileName);
 | 
					    void SeekError(const wchar *FileName);
 | 
				
			||||||
    void GeneralErrMsg(const char *Msg);
 | 
					    void GeneralErrMsg(const wchar *fmt,...);
 | 
				
			||||||
    void MemoryErrorMsg();
 | 
					    void MemoryErrorMsg();
 | 
				
			||||||
    void OpenErrorMsg(const char *FileName);
 | 
					    void OpenErrorMsg(const wchar *FileName);
 | 
				
			||||||
    void OpenErrorMsg(const char *ArcName,const char *FileName);
 | 
					    void OpenErrorMsg(const wchar *ArcName,const wchar *FileName);
 | 
				
			||||||
    void CreateErrorMsg(const char *FileName);
 | 
					    void CreateErrorMsg(const wchar *FileName);
 | 
				
			||||||
    void CreateErrorMsg(const char *ArcName,const char *FileName);
 | 
					    void CreateErrorMsg(const wchar *ArcName,const wchar *FileName);
 | 
				
			||||||
    void ReadErrorMsg(const char *ArcName,const char *FileName);
 | 
					    void ReadErrorMsg(const wchar *FileName);
 | 
				
			||||||
    void WriteErrorMsg(const char *ArcName,const char *FileName);
 | 
					    void ReadErrorMsg(const wchar *ArcName,const wchar *FileName);
 | 
				
			||||||
    void Exit(int ExitCode);
 | 
					    void WriteErrorMsg(const wchar *ArcName,const wchar *FileName);
 | 
				
			||||||
    void SetErrorCode(int Code);
 | 
					    void ArcBrokenMsg(const wchar *ArcName);
 | 
				
			||||||
    int GetErrorCode() {return(ExitCode);}
 | 
					    void ChecksumFailedMsg(const wchar *ArcName,const wchar *FileName);
 | 
				
			||||||
    int GetErrorCount() {return(ErrCount);}
 | 
					    void UnknownMethodMsg(const wchar *ArcName,const wchar *FileName);
 | 
				
			||||||
 | 
					    void Exit(RAR_EXIT ExitCode);
 | 
				
			||||||
 | 
					    void SetErrorCode(RAR_EXIT Code);
 | 
				
			||||||
 | 
					    RAR_EXIT GetErrorCode() {return ExitCode;}
 | 
				
			||||||
 | 
					    uint GetErrorCount() {return ErrCount;}
 | 
				
			||||||
    void SetSignalHandlers(bool Enable);
 | 
					    void SetSignalHandlers(bool Enable);
 | 
				
			||||||
    void Throw(int Code);
 | 
					    void Throw(RAR_EXIT Code);
 | 
				
			||||||
    void SetSilent(bool Mode) {Silent=Mode;};
 | 
					    void SetSilent(bool Mode) {Silent=Mode;}
 | 
				
			||||||
    void SetShutdown(bool Mode) {DoShutdown=Mode;};
 | 
					    bool GetSysErrMsg(wchar *Msg,size_t Size);
 | 
				
			||||||
    void SysErrMsg();
 | 
					    void SysErrMsg();
 | 
				
			||||||
 | 
					    int GetSystemErrorCode();
 | 
				
			||||||
 | 
					    void SetSystemErrorCode(int Code);
 | 
				
			||||||
 | 
					    void SetDisableShutdown() {DisableShutdown=true;}
 | 
				
			||||||
 | 
					    bool IsShutdownEnabled() {return !DisableShutdown;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool UserBreak; // Ctrl+Break is pressed.
 | 
				
			||||||
 | 
					    bool MainExit; // main() is completed.
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,51 +1,43 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#include "hardlinks.cpp"
 | 
				
			||||||
#include "win32acl.cpp"
 | 
					 | 
				
			||||||
#include "win32stm.cpp"
 | 
					#include "win32stm.cpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					#include "win32acl.cpp"
 | 
				
			||||||
 | 
					#include "win32lnk.cpp"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef _BEOS
 | 
					
 | 
				
			||||||
#include "beosea.cpp"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if defined(_EMX) && !defined(_DJGPP)
 | 
					 | 
				
			||||||
#include "os2ea.cpp"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
#include "uowners.cpp"
 | 
					#include "uowners.cpp"
 | 
				
			||||||
 | 
					#ifdef SAVE_LINKS
 | 
				
			||||||
 | 
					#include "ulinks.cpp"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR2 service header extra records.
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
void SetExtraInfo(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW)
 | 
					void SetExtraInfo20(CommandData *Cmd,Archive &Arc,wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  if (Cmd->Test)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
  switch(Arc.SubBlockHead.SubType)
 | 
					  switch(Arc.SubBlockHead.SubType)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
#if defined(_EMX) && !defined(_DJGPP)
 | 
					 | 
				
			||||||
    case EA_HEAD:
 | 
					 | 
				
			||||||
      if (Cmd->ProcessEA)
 | 
					 | 
				
			||||||
        ExtractOS2EA(Arc,Name);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
    case UO_HEAD:
 | 
					    case UO_HEAD:
 | 
				
			||||||
      if (Cmd->ProcessOwners)
 | 
					      if (Cmd->ProcessOwners)
 | 
				
			||||||
        ExtractUnixOwner(Arc,Name);
 | 
					        ExtractUnixOwner20(Arc,Name);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef _BEOS
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    case BEEA_HEAD:
 | 
					 | 
				
			||||||
      if (Cmd->ProcessEA)
 | 
					 | 
				
			||||||
        ExtractBeEA(Arc,Name);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
    case NTACL_HEAD:
 | 
					    case NTACL_HEAD:
 | 
				
			||||||
      if (Cmd->ProcessOwners)
 | 
					      if (Cmd->ProcessOwners)
 | 
				
			||||||
        ExtractACL(Arc,Name,NameW);
 | 
					        ExtractACL20(Arc,Name);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case STREAM_HEAD:
 | 
					    case STREAM_HEAD:
 | 
				
			||||||
      ExtractStreams(Arc,Name,NameW);
 | 
					      ExtractStreams20(Arc,Name);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -53,24 +45,134 @@ void SetExtraInfo(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SetExtraInfoNew(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW)
 | 
					// RAR3 and RAR5 service header extra records.
 | 
				
			||||||
 | 
					void SetExtraInfo(CommandData *Cmd,Archive &Arc,wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_EMX) && !defined(_DJGPP)
 | 
					 | 
				
			||||||
  if (Cmd->ProcessEA && Arc.SubHead.CmpName(SUBHEAD_TYPE_OS2EA))
 | 
					 | 
				
			||||||
    ExtractOS2EANew(Arc,Name);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
  if (Cmd->ProcessOwners && Arc.SubHead.CmpName(SUBHEAD_TYPE_UOWNER))
 | 
					  if (!Cmd->Test && Cmd->ProcessOwners && Arc.Format==RARFMT15 &&
 | 
				
			||||||
    ExtractUnixOwnerNew(Arc,Name);
 | 
					      Arc.SubHead.CmpName(SUBHEAD_TYPE_UOWNER))
 | 
				
			||||||
 | 
					    ExtractUnixOwner30(Arc,Name);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef _BEOS
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  if (Cmd->ProcessEA && Arc.SubHead.CmpName(SUBHEAD_TYPE_UOWNER))
 | 
					  if (!Cmd->Test && Cmd->ProcessOwners && Arc.SubHead.CmpName(SUBHEAD_TYPE_ACL))
 | 
				
			||||||
    ExtractUnixOwnerNew(Arc,Name);
 | 
					    ExtractACL(Arc,Name);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  if (Cmd->ProcessOwners && Arc.SubHead.CmpName(SUBHEAD_TYPE_ACL))
 | 
					 | 
				
			||||||
    ExtractACLNew(Arc,Name,NameW);
 | 
					 | 
				
			||||||
  if (Arc.SubHead.CmpName(SUBHEAD_TYPE_STREAM))
 | 
					  if (Arc.SubHead.CmpName(SUBHEAD_TYPE_STREAM))
 | 
				
			||||||
    ExtractStreamsNew(Arc,Name,NameW);
 | 
					    ExtractStreams(Arc,Name,Cmd->Test);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Extra data stored directly in file header.
 | 
				
			||||||
 | 
					void SetFileHeaderExtra(CommandData *Cmd,Archive &Arc,wchar *Name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _UNIX
 | 
				
			||||||
 | 
					   if (Cmd->ProcessOwners && Arc.Format==RARFMT50 && Arc.FileHead.UnixOwnerSet)
 | 
				
			||||||
 | 
					     SetUnixOwner(Arc,Name);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Calculate a number of path components except \. and \..
 | 
				
			||||||
 | 
					static int CalcAllowedDepth(const wchar *Name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int AllowedDepth=0;
 | 
				
			||||||
 | 
					  while (*Name!=0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (IsPathDiv(Name[0]) && Name[1]!=0 && !IsPathDiv(Name[1]))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool Dot=Name[1]=='.' && (IsPathDiv(Name[2]) || Name[2]==0);
 | 
				
			||||||
 | 
					      bool Dot2=Name[1]=='.' && Name[2]=='.' && (IsPathDiv(Name[3]) || Name[3]==0);
 | 
				
			||||||
 | 
					      if (!Dot && !Dot2)
 | 
				
			||||||
 | 
					        AllowedDepth++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Name++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return AllowedDepth;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Check if all existing path components are directories and not links.
 | 
				
			||||||
 | 
					static bool LinkInPath(const wchar *Name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wchar Path[NM];
 | 
				
			||||||
 | 
					  if (wcslen(Name)>=ASIZE(Path))
 | 
				
			||||||
 | 
					    return true;  // It should not be that long, skip.
 | 
				
			||||||
 | 
					  wcsncpyz(Path,Name,ASIZE(Path));
 | 
				
			||||||
 | 
					  for (wchar *s=Path+wcslen(Path)-1;s>Path;s--)
 | 
				
			||||||
 | 
					    if (IsPathDiv(*s))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      *s=0;
 | 
				
			||||||
 | 
					      FindData FD;
 | 
				
			||||||
 | 
					      if (FindFile::FastFind(Path,&FD,true) && (FD.IsLink || !FD.IsDir))
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // Catch root dir based /path/file paths also as stuff like \\?\.
 | 
				
			||||||
 | 
					  // Do not check PrepSrcName here, it can be root based if destination path
 | 
				
			||||||
 | 
					  // is a root based.
 | 
				
			||||||
 | 
					  if (IsFullRootPath(SrcName) || IsFullRootPath(TargetName))
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Number of ".." in link target.
 | 
				
			||||||
 | 
					  int UpLevels=0;
 | 
				
			||||||
 | 
					  for (int Pos=0;*TargetName!=0;Pos++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    bool Dot2=TargetName[0]=='.' && TargetName[1]=='.' && 
 | 
				
			||||||
 | 
					              (IsPathDiv(TargetName[2]) || TargetName[2]==0) &&
 | 
				
			||||||
 | 
					              (Pos==0 || IsPathDiv(*(TargetName-1)));
 | 
				
			||||||
 | 
					    if (Dot2)
 | 
				
			||||||
 | 
					      UpLevels++;
 | 
				
			||||||
 | 
					    TargetName++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // If link target includes "..", it must not have another links
 | 
				
			||||||
 | 
					  // in the path, because they can bypass our safety check. For example,
 | 
				
			||||||
 | 
					  // suppose we extracted "lnk1" -> "." first and "lnk1/lnk2" -> ".." next
 | 
				
			||||||
 | 
					  // or "dir/lnk1" -> ".." first and "dir/lnk1/lnk2" -> ".." next.
 | 
				
			||||||
 | 
					  if (UpLevels>0 && LinkInPath(PrepSrcName))
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  // We could check just prepared src name, but for extra safety
 | 
				
			||||||
 | 
					  // we check both original (as from archive header) and prepared
 | 
				
			||||||
 | 
					  // (after applying the destination path and -ep switches) names.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int AllowedDepth=CalcAllowedDepth(SrcName); // Original name depth.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Remove the destination path from prepared name if any. We should not
 | 
				
			||||||
 | 
					  // count the destination path depth, because the link target must point
 | 
				
			||||||
 | 
					  // inside of this path, not outside of it.
 | 
				
			||||||
 | 
					  size_t ExtrPathLength=wcslen(Cmd->ExtrPath);
 | 
				
			||||||
 | 
					  if (ExtrPathLength>0 && wcsncmp(PrepSrcName,Cmd->ExtrPath,ExtrPathLength)==0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    PrepSrcName+=ExtrPathLength;
 | 
				
			||||||
 | 
					    while (IsPathDiv(*PrepSrcName))
 | 
				
			||||||
 | 
					      PrepSrcName++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  int PrepAllowedDepth=CalcAllowedDepth(PrepSrcName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return AllowedDepth>=UpLevels && PrepAllowedDepth>=UpLevels;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined(SAVE_LINKS) && defined(_UNIX)
 | 
				
			||||||
 | 
					  // For RAR 3.x archives we process links even in test mode to skip link data.
 | 
				
			||||||
 | 
					  if (Arc.Format==RARFMT15)
 | 
				
			||||||
 | 
					    return ExtractUnixLink30(Cmd,DataIO,Arc,LinkName);
 | 
				
			||||||
 | 
					  if (Arc.Format==RARFMT50)
 | 
				
			||||||
 | 
					    return ExtractUnixLink50(Cmd,LinkName,&Arc.FileHead);
 | 
				
			||||||
 | 
					#elif defined _WIN_ALL
 | 
				
			||||||
 | 
					  // RAR 5.0 archives store link information in file header, so there is
 | 
				
			||||||
 | 
					  // no need to additionally test it if we do not create a file.
 | 
				
			||||||
 | 
					  if (Arc.Format==RARFMT50)
 | 
				
			||||||
 | 
					    return CreateReparsePoint(Cmd,LinkName,&Arc.FileHead);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,23 @@
 | 
				
			||||||
#ifndef _RAR_EXTINFO_
 | 
					#ifndef _RAR_EXTINFO_
 | 
				
			||||||
#define _RAR_EXTINFO_
 | 
					#define _RAR_EXTINFO_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName);
 | 
				
			||||||
 | 
					bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName);
 | 
				
			||||||
 | 
					#ifdef _UNIX
 | 
				
			||||||
 | 
					void SetUnixOwner(Archive &Arc,const wchar *FileName);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool ExtractHardlink(wchar *NameNew,wchar *NameExisting,size_t NameExistingSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GetStreamNameNTFS(Archive &Arc,wchar *StreamName,size_t MaxSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					bool SetPrivilege(LPCTSTR PrivName);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SetExtraInfo20(CommandData *Cmd,Archive &Arc,wchar *Name);
 | 
				
			||||||
 | 
					void SetExtraInfo(CommandData *Cmd,Archive &Arc,wchar *Name);
 | 
				
			||||||
 | 
					void SetFileHeaderExtra(CommandData *Cmd,Archive &Arc,wchar *Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SetExtraInfo(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW);
 | 
					 | 
				
			||||||
void SetExtraInfoNew(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1466
									
								
								libunrar/extract.cpp
								
								
								
								
							
							
						
						
									
										1466
									
								
								libunrar/extract.cpp
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -6,9 +6,25 @@ enum EXTRACT_ARC_CODE {EXTRACT_ARC_NEXT,EXTRACT_ARC_REPEAT};
 | 
				
			||||||
class CmdExtract
 | 
					class CmdExtract
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    EXTRACT_ARC_CODE ExtractArchive(CommandData *Cmd);
 | 
					    EXTRACT_ARC_CODE ExtractArchive();
 | 
				
			||||||
 | 
					    bool ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize);
 | 
				
			||||||
 | 
					    void ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *DestName,size_t DestSize);
 | 
				
			||||||
 | 
					#ifdef RARDLL
 | 
				
			||||||
 | 
					    bool ExtrDllGetPassword();
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    bool ExtrGetPassword(Archive &Arc,const wchar *ArcFileName);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					    void ConvertDosPassword(Archive &Arc,SecPassword &DestPwd);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    void ExtrCreateDir(Archive &Arc,const wchar *ArcFileName);
 | 
				
			||||||
 | 
					    bool ExtrCreateFile(Archive &Arc,File &CurFile);
 | 
				
			||||||
 | 
					    bool CheckUnpVer(Archive &Arc,const wchar *ArcFileName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RarTime StartTime; // time when extraction started
 | 
					    RarTime StartTime; // time when extraction started
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CommandData *Cmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ComprDataIO DataIO;
 | 
					    ComprDataIO DataIO;
 | 
				
			||||||
    Unpack *Unp;
 | 
					    Unpack *Unp;
 | 
				
			||||||
    unsigned long TotalFileCount;
 | 
					    unsigned long TotalFileCount;
 | 
				
			||||||
| 
						 | 
					@ -19,25 +35,28 @@ class CmdExtract
 | 
				
			||||||
    bool AllMatchesExact;
 | 
					    bool AllMatchesExact;
 | 
				
			||||||
    bool ReconstructDone;
 | 
					    bool ReconstructDone;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char ArcName[NM];
 | 
					    // If any non-zero solid file was successfully unpacked before current.
 | 
				
			||||||
    wchar ArcNameW[NM];
 | 
					    // If true and if current encrypted file is broken, obviously
 | 
				
			||||||
 | 
					    // the password is correct and we can report broken CRC without
 | 
				
			||||||
 | 
					    // any wrong password hints.
 | 
				
			||||||
 | 
					    bool AnySolidDataUnpackedWell;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char Password[MAXPASSWORD];
 | 
					    wchar ArcName[NM];
 | 
				
			||||||
    bool PasswordAll;
 | 
					
 | 
				
			||||||
    bool PrevExtracted;
 | 
					    bool GlobalPassword;
 | 
				
			||||||
    char DestFileName[NM];
 | 
					    bool PrevProcessed; // If previous file was successfully extracted or tested.
 | 
				
			||||||
    wchar DestFileNameW[NM];
 | 
					    wchar DestFileName[NM];
 | 
				
			||||||
    bool PasswordCancelled;
 | 
					    bool PasswordCancelled;
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(SILENT)
 | 
				
			||||||
 | 
					    bool Fat32,NotFat32;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    CmdExtract();
 | 
					    CmdExtract(CommandData *Cmd);
 | 
				
			||||||
    ~CmdExtract();
 | 
					    ~CmdExtract();
 | 
				
			||||||
    void DoExtract(CommandData *Cmd);
 | 
					    void DoExtract();
 | 
				
			||||||
    void ExtractArchiveInit(CommandData *Cmd,Archive &Arc);
 | 
					    void ExtractArchiveInit(Archive &Arc);
 | 
				
			||||||
    bool ExtractCurrentFile(CommandData *Cmd,Archive &Arc,size_t HeaderSize,
 | 
					    bool ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat);
 | 
				
			||||||
                            bool &Repeat);
 | 
					 | 
				
			||||||
    static void UnstoreFile(ComprDataIO &DataIO,int64 DestUnpSize);
 | 
					    static void UnstoreFile(ComprDataIO &DataIO,int64 DestUnpSize);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool SignatureFound;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,245 +1,163 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool FileCreate(RAROptions *Cmd,File *NewFile,char *Name,wchar *NameW,
 | 
					// If NewFile==NULL, we delete created file after user confirmation.
 | 
				
			||||||
                OVERWRITE_MODE Mode,bool *UserReject,int64 FileSize,
 | 
					// It is useful we we need to overwrite an existing folder or file,
 | 
				
			||||||
                uint FileTime)
 | 
					// but need user confirmation for that.
 | 
				
			||||||
 | 
					bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
 | 
				
			||||||
 | 
					                bool *UserReject,int64 FileSize,RarTime *FileTime,bool WriteOnly)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (UserReject!=NULL)
 | 
					  if (UserReject!=NULL)
 | 
				
			||||||
    *UserReject=false;
 | 
					    *UserReject=false;
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  bool ShortNameChanged=false;
 | 
					  bool ShortNameChanged=false;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  while (FileExist(Name,NameW))
 | 
					  while (FileExist(Name))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
    if (!ShortNameChanged)
 | 
					    if (!ShortNameChanged)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					      // Avoid the infinite loop if UpdateExistingShortName returns
 | 
				
			||||||
 | 
					      // the same name.
 | 
				
			||||||
      ShortNameChanged=true;
 | 
					      ShortNameChanged=true;
 | 
				
			||||||
      if (UpdateExistingShortName(Name,NameW))
 | 
					
 | 
				
			||||||
 | 
					      // Maybe our long name matches the short name of existing file.
 | 
				
			||||||
 | 
					      // Let's check if we can change the short name.
 | 
				
			||||||
 | 
					      if (UpdateExistingShortName(Name))
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    // Allow short name check again. It is necessary, because rename and
 | 
				
			||||||
 | 
					    // autorename below can change the name, so we need to check it again.
 | 
				
			||||||
 | 
					    ShortNameChanged=false;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    if (Mode==OVERWRITE_NONE)
 | 
					    UIASKREP_RESULT Choice=uiAskReplaceEx(Cmd,Name,MaxNameSize,FileSize,FileTime,(NewFile==NULL ? UIASKREP_F_NORENAME:0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Choice==UIASKREP_R_REPLACE)
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    if (Choice==UIASKREP_R_SKIP)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      if (UserReject!=NULL)
 | 
					      if (UserReject!=NULL)
 | 
				
			||||||
        *UserReject=true;
 | 
					        *UserReject=true;
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#ifdef SILENT
 | 
					 | 
				
			||||||
    Mode=OVERWRITE_ALL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    if (Cmd->AllYes || Mode==OVERWRITE_ALL)
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    if (Mode==OVERWRITE_DEFAULT || Mode==OVERWRITE_FORCE_ASK)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      eprintf(St(MFileExists),Name);
 | 
					 | 
				
			||||||
      int Choice=Ask(St(MYesNoAllRenQ));
 | 
					 | 
				
			||||||
      if (Choice==1)
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      if (Choice==2)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (UserReject!=NULL)
 | 
					 | 
				
			||||||
          *UserReject=true;
 | 
					 | 
				
			||||||
        return(false);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (Choice==3)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        Cmd->Overwrite=OVERWRITE_ALL;
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (Choice==4)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (UserReject!=NULL)
 | 
					 | 
				
			||||||
          *UserReject=true;
 | 
					 | 
				
			||||||
        Cmd->Overwrite=OVERWRITE_NONE;
 | 
					 | 
				
			||||||
        return(false);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (Choice==5)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        mprintf(St(MAskNewName));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        char NewName[NM];
 | 
					 | 
				
			||||||
#ifdef  _WIN_32
 | 
					 | 
				
			||||||
        File SrcFile;
 | 
					 | 
				
			||||||
        SrcFile.SetHandleType(FILE_HANDLESTD);
 | 
					 | 
				
			||||||
        int Size=SrcFile.Read(NewName,sizeof(NewName)-1);
 | 
					 | 
				
			||||||
        NewName[Size]=0;
 | 
					 | 
				
			||||||
        OemToChar(NewName,NewName);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        if (fgets(NewName,sizeof(NewName),stdin)==NULL)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          // Process fgets failure as if user answered 'No'.
 | 
					 | 
				
			||||||
          if (UserReject!=NULL)
 | 
					 | 
				
			||||||
            *UserReject=true;
 | 
					 | 
				
			||||||
          return(false);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        RemoveLF(NewName);
 | 
					 | 
				
			||||||
        if (PointToName(NewName)==NewName)
 | 
					 | 
				
			||||||
          strcpy(PointToName(Name),NewName);
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          strcpy(Name,NewName);
 | 
					 | 
				
			||||||
        if (NameW!=NULL)
 | 
					 | 
				
			||||||
          *NameW=0;
 | 
					 | 
				
			||||||
        continue;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (Choice==6)
 | 
					 | 
				
			||||||
        ErrHandler.Exit(USER_BREAK);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (Mode==OVERWRITE_AUTORENAME)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      if (GetAutoRenamedName(Name))
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (NameW!=NULL)
 | 
					 | 
				
			||||||
          *NameW=0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        Mode=OVERWRITE_DEFAULT;
 | 
					 | 
				
			||||||
      continue;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (Choice==UIASKREP_R_CANCEL)
 | 
				
			||||||
 | 
					      ErrHandler.Exit(RARX_USERBREAK);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (NewFile!=NULL && NewFile->Create(Name,NameW))
 | 
					
 | 
				
			||||||
    return(true);
 | 
					  // Try to truncate the existing file first instead of delete,
 | 
				
			||||||
  PrepareToDelete(Name,NameW);
 | 
					  // so we preserve existing file permissions such as NTFS permissions.
 | 
				
			||||||
  CreatePath(Name,NameW,true);
 | 
					  uint FileMode=WriteOnly ? FMF_WRITE|FMF_SHAREREAD:FMF_UPDATE|FMF_SHAREREAD;
 | 
				
			||||||
  return(NewFile!=NULL ? NewFile->Create(Name,NameW):DelFile(Name,NameW));
 | 
					  if (NewFile!=NULL && NewFile->Create(Name,FileMode))
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CreatePath(Name,true);
 | 
				
			||||||
 | 
					  return NewFile!=NULL ? NewFile->Create(Name,FileMode):DelFile(Name);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool GetAutoRenamedName(char *Name)
 | 
					bool GetAutoRenamedName(wchar *Name,size_t MaxNameSize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char NewName[NM];
 | 
					  wchar NewName[NM];
 | 
				
			||||||
 | 
					  size_t NameLength=wcslen(Name);
 | 
				
			||||||
  if (strlen(Name)>sizeof(NewName)-10)
 | 
					  wchar *Ext=GetExt(Name);
 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
  char *Ext=GetExt(Name);
 | 
					 | 
				
			||||||
  if (Ext==NULL)
 | 
					  if (Ext==NULL)
 | 
				
			||||||
    Ext=Name+strlen(Name);
 | 
					    Ext=Name+NameLength;
 | 
				
			||||||
  for (int FileVer=1;;FileVer++)
 | 
					  for (uint FileVer=1;;FileVer++)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    sprintf(NewName,"%.*s(%d)%s",int(Ext-Name),Name,FileVer,Ext);
 | 
					    swprintf(NewName,ASIZE(NewName),L"%.*ls(%u)%ls",uint(Ext-Name),Name,FileVer,Ext);
 | 
				
			||||||
    if (!FileExist(NewName))
 | 
					    if (!FileExist(NewName))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      strcpy(Name,NewName);
 | 
					      wcsncpyz(Name,NewName,MaxNameSize);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (FileVer>=1000000)
 | 
					    if (FileVer>=1000000)
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(true);
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
bool UpdateExistingShortName(char *Name,wchar *NameW)
 | 
					// If we find a file, which short name is equal to 'Name', we try to change
 | 
				
			||||||
 | 
					// its short name, while preserving the long name. It helps when unpacking
 | 
				
			||||||
 | 
					// an archived file, which long name is equal to short name of already
 | 
				
			||||||
 | 
					// existing file. Otherwise we would overwrite the already existing file,
 | 
				
			||||||
 | 
					// even though its long name does not match the name of unpacking file.
 | 
				
			||||||
 | 
					bool UpdateExistingShortName(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  FindData fd;
 | 
					  wchar LongPathName[NM];
 | 
				
			||||||
  if (!FindFile::FastFind(Name,NameW,&fd))
 | 
					  DWORD Res=GetLongPathName(Name,LongPathName,ASIZE(LongPathName));
 | 
				
			||||||
    return(false);
 | 
					  if (Res==0 || Res>=ASIZE(LongPathName))
 | 
				
			||||||
  if (*fd.Name==0 || *fd.ShortName==0)
 | 
					    return false;
 | 
				
			||||||
    return(false);
 | 
					  wchar ShortPathName[NM];
 | 
				
			||||||
  if (stricomp(PointToName(fd.Name),fd.ShortName)==0 ||
 | 
					  Res=GetShortPathName(Name,ShortPathName,ASIZE(ShortPathName));
 | 
				
			||||||
      stricomp(PointToName(Name),fd.ShortName)!=0)
 | 
					  if (Res==0 || Res>=ASIZE(ShortPathName))
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
 | 
					  wchar *LongName=PointToName(LongPathName);
 | 
				
			||||||
 | 
					  wchar *ShortName=PointToName(ShortPathName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char NewName[NM];
 | 
					  // We continue only if file has a short name, which does not match its
 | 
				
			||||||
  for (int I=0;I<10000;I+=123)
 | 
					  // long name, and this short name is equal to name of file which we need
 | 
				
			||||||
 | 
					  // to create.
 | 
				
			||||||
 | 
					  if (*ShortName==0 || wcsicomp(LongName,ShortName)==0 ||
 | 
				
			||||||
 | 
					      wcsicomp(PointToName(Name),ShortName)!=0)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Generate the temporary new name for existing file.
 | 
				
			||||||
 | 
					  wchar NewName[NM];
 | 
				
			||||||
 | 
					  *NewName=0;
 | 
				
			||||||
 | 
					  for (int I=0;I<10000 && *NewName==0;I+=123)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    strncpyz(NewName,Name,ASIZE(NewName));
 | 
					    // Here we copy the path part of file to create. We'll make the temporary
 | 
				
			||||||
    sprintf(PointToName(NewName),"rtmp%d",I);
 | 
					    // file in the same folder.
 | 
				
			||||||
    if (!FileExist(NewName))
 | 
					    wcsncpyz(NewName,Name,ASIZE(NewName));
 | 
				
			||||||
      break;
 | 
					
 | 
				
			||||||
 | 
					    // Here we set the random name part.
 | 
				
			||||||
 | 
					    swprintf(PointToName(NewName),ASIZE(NewName),L"rtmp%d",I);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // If such file is already exist, try next random name.
 | 
				
			||||||
 | 
					    if (FileExist(NewName))
 | 
				
			||||||
 | 
					      *NewName=0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (FileExist(NewName))
 | 
					
 | 
				
			||||||
    return(false);
 | 
					  // If we could not generate the name not used by any other file, we return.
 | 
				
			||||||
  char FullName[NM];
 | 
					  if (*NewName==0)
 | 
				
			||||||
  strncpyz(FullName,Name,ASIZE(FullName));
 | 
					    return false;
 | 
				
			||||||
  strcpy(PointToName(FullName),PointToName(fd.Name));
 | 
					  
 | 
				
			||||||
 | 
					  // FastFind returns the name without path, but we need the fully qualified
 | 
				
			||||||
 | 
					  // name for renaming, so we use the path from file to create and long name
 | 
				
			||||||
 | 
					  // from existing file.
 | 
				
			||||||
 | 
					  wchar FullName[NM];
 | 
				
			||||||
 | 
					  wcsncpyz(FullName,Name,ASIZE(FullName));
 | 
				
			||||||
 | 
					  SetName(FullName,LongName,ASIZE(FullName));
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Rename the existing file to randomly generated name. Normally it changes
 | 
				
			||||||
 | 
					  // the short name too.
 | 
				
			||||||
  if (!MoveFile(FullName,NewName))
 | 
					  if (!MoveFile(FullName,NewName))
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Now we need to create the temporary empty file with same name as
 | 
				
			||||||
 | 
					  // short name of our already existing file. We do it to occupy its previous
 | 
				
			||||||
 | 
					  // short name and not allow to use it again when renaming the file back to
 | 
				
			||||||
 | 
					  // its original long name.
 | 
				
			||||||
  File KeepShortFile;
 | 
					  File KeepShortFile;
 | 
				
			||||||
  bool Created=false;
 | 
					  bool Created=false;
 | 
				
			||||||
  if (!FileExist(Name))
 | 
					  if (!FileExist(Name))
 | 
				
			||||||
    Created=KeepShortFile.Create(Name);
 | 
					    Created=KeepShortFile.Create(Name,FMF_WRITE|FMF_SHAREREAD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Now we rename the existing file from temporary name to original long name.
 | 
				
			||||||
 | 
					  // Since its previous short name is occupied by another file, it should
 | 
				
			||||||
 | 
					  // get another short name.
 | 
				
			||||||
  MoveFile(NewName,FullName);
 | 
					  MoveFile(NewName,FullName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Created)
 | 
					  if (Created)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    // Delete the temporary zero length file occupying the short name,
 | 
				
			||||||
    KeepShortFile.Close();
 | 
					    KeepShortFile.Close();
 | 
				
			||||||
    KeepShortFile.Delete();
 | 
					    KeepShortFile.Delete();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(true);
 | 
					  // We successfully changed the short name. Maybe sometimes we'll simplify
 | 
				
			||||||
 | 
					  // this function by use of SetFileShortName Windows API call.
 | 
				
			||||||
 | 
					  // But SetFileShortName is not available in older Windows.
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
bool UpdateExistingShortName(char *Name,wchar *NameW)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (WinNT()<5)
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
  FindData fd;
 | 
					 | 
				
			||||||
  if (!FindFile::FastFind(Name,NameW,&fd))
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
  if (*fd.Name==0 || *fd.ShortName==0)
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
  if (stricomp(PointToName(fd.Name),fd.ShortName)==0 ||
 | 
					 | 
				
			||||||
      stricomp(PointToName(Name),fd.ShortName)!=0)
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  typedef BOOL (WINAPI *SETFILESHORTNAME)(HANDLE,LPCSTR);
 | 
					 | 
				
			||||||
  static SETFILESHORTNAME pSetFileShortName=NULL;
 | 
					 | 
				
			||||||
  if (pSetFileShortName==NULL)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    HMODULE hKernel=GetModuleHandle("kernel32.dll");
 | 
					 | 
				
			||||||
    if (hKernel!=NULL)
 | 
					 | 
				
			||||||
      pSetFileShortName=(SETFILESHORTNAME)GetProcAddress(hKernel,"SetFileShortNameA");
 | 
					 | 
				
			||||||
    if (pSetFileShortName==NULL)
 | 
					 | 
				
			||||||
      return(false);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  static bool RestoreEnabled=false;
 | 
					 | 
				
			||||||
  if (!RestoreEnabled)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    HANDLE hToken;
 | 
					 | 
				
			||||||
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
 | 
					 | 
				
			||||||
      return(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    TOKEN_PRIVILEGES tp;
 | 
					 | 
				
			||||||
    tp.PrivilegeCount = 1;
 | 
					 | 
				
			||||||
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (LookupPrivilegeValue(NULL,SE_RESTORE_NAME,&tp.Privileges[0].Luid))
 | 
					 | 
				
			||||||
      AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CloseHandle(hToken);
 | 
					 | 
				
			||||||
    RestoreEnabled=true;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  wchar FileNameW[NM];
 | 
					 | 
				
			||||||
  GetWideName(Name,NameW,FileNameW);
 | 
					 | 
				
			||||||
  HANDLE hFile=CreateFileW(FileNameW,GENERIC_WRITE|DELETE,FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
					 | 
				
			||||||
                           NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
 | 
					 | 
				
			||||||
  if (hFile==INVALID_HANDLE_VALUE)
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool RetCode=false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  char FullName[NM];
 | 
					 | 
				
			||||||
  wchar FullNameW[NM];
 | 
					 | 
				
			||||||
  strcpy(FullName,Name);
 | 
					 | 
				
			||||||
  strcpyw(FullNameW,NullToEmpty(NameW));
 | 
					 | 
				
			||||||
  for (int I=1;I<1000000;I++)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    char NewName[NM];
 | 
					 | 
				
			||||||
    sprintf(NewName,"NAME~%d.%d",I%1000,I/1000+1);
 | 
					 | 
				
			||||||
    strcpy(PointToName(FullName),NewName);
 | 
					 | 
				
			||||||
    if (*FullNameW)
 | 
					 | 
				
			||||||
      CharToWide(NewName,PointToName(FullNameW));
 | 
					 | 
				
			||||||
    if (!FileExist(FullName,FullNameW))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      RetCode=pSetFileShortName(hFile,NewName);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  CloseHandle(hFile);
 | 
					 | 
				
			||||||
  return(RetCode);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,14 @@
 | 
				
			||||||
#ifndef _RAR_FILECREATE_
 | 
					#ifndef _RAR_FILECREATE_
 | 
				
			||||||
#define _RAR_FILECREATE_
 | 
					#define _RAR_FILECREATE_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool FileCreate(RAROptions *Cmd,File *NewFile,char *Name,wchar *NameW,
 | 
					bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
 | 
				
			||||||
                OVERWRITE_MODE Mode,bool *UserReject,int64 FileSize=INT64NDF,
 | 
					                bool *UserReject,int64 FileSize=INT64NDF,
 | 
				
			||||||
                uint FileTime=0);
 | 
					                RarTime *FileTime=NULL,bool WriteOnly=false);
 | 
				
			||||||
bool GetAutoRenamedName(char *Name);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					bool GetAutoRenamedName(wchar *Name,size_t MaxNameSize);
 | 
				
			||||||
bool UpdateExistingShortName(char *Name,wchar *NameW);
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
 | 
					bool UpdateExistingShortName(const wchar *Name);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,9 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static File *CreatedFiles[256];
 | 
					 | 
				
			||||||
static int RemoveCreatedActive=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
File::File()
 | 
					File::File()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  hFile=BAD_HANDLE;
 | 
					  hFile=FILE_BAD_HANDLE;
 | 
				
			||||||
  *FileName=0;
 | 
					  *FileName=0;
 | 
				
			||||||
  *FileNameW=0;
 | 
					 | 
				
			||||||
  NewFile=false;
 | 
					  NewFile=false;
 | 
				
			||||||
  LastWrite=false;
 | 
					  LastWrite=false;
 | 
				
			||||||
  HandleType=FILE_HANDLENORMAL;
 | 
					  HandleType=FILE_HANDLENORMAL;
 | 
				
			||||||
| 
						 | 
					@ -16,17 +12,18 @@ File::File()
 | 
				
			||||||
  ErrorType=FILE_SUCCESS;
 | 
					  ErrorType=FILE_SUCCESS;
 | 
				
			||||||
  OpenShared=false;
 | 
					  OpenShared=false;
 | 
				
			||||||
  AllowDelete=true;
 | 
					  AllowDelete=true;
 | 
				
			||||||
  CloseCount=0;
 | 
					 | 
				
			||||||
  AllowExceptions=true;
 | 
					  AllowExceptions=true;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  PreserveAtime=false;
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  NoSequentialRead=false;
 | 
					  NoSequentialRead=false;
 | 
				
			||||||
 | 
					  CreateMode=FMF_UNDEFINED;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
File::~File()
 | 
					File::~File()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (hFile!=BAD_HANDLE && !SkipClose)
 | 
					  if (hFile!=FILE_BAD_HANDLE && !SkipClose)
 | 
				
			||||||
    if (NewFile)
 | 
					    if (NewFile)
 | 
				
			||||||
      Delete();
 | 
					      Delete();
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
| 
						 | 
					@ -37,287 +34,314 @@ File::~File()
 | 
				
			||||||
void File::operator = (File &SrcFile)
 | 
					void File::operator = (File &SrcFile)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  hFile=SrcFile.hFile;
 | 
					  hFile=SrcFile.hFile;
 | 
				
			||||||
  strcpy(FileName,SrcFile.FileName);
 | 
					 | 
				
			||||||
  NewFile=SrcFile.NewFile;
 | 
					  NewFile=SrcFile.NewFile;
 | 
				
			||||||
  LastWrite=SrcFile.LastWrite;
 | 
					  LastWrite=SrcFile.LastWrite;
 | 
				
			||||||
  HandleType=SrcFile.HandleType;
 | 
					  HandleType=SrcFile.HandleType;
 | 
				
			||||||
 | 
					  wcsncpyz(FileName,SrcFile.FileName,ASIZE(FileName));
 | 
				
			||||||
  SrcFile.SkipClose=true;
 | 
					  SrcFile.SkipClose=true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::Open(const char *Name,const wchar *NameW,bool OpenShared,bool Update)
 | 
					bool File::Open(const wchar *Name,uint Mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ErrorType=FILE_SUCCESS;
 | 
					  ErrorType=FILE_SUCCESS;
 | 
				
			||||||
  FileHandle hNewFile;
 | 
					  FileHandle hNewFile;
 | 
				
			||||||
  if (File::OpenShared)
 | 
					  bool OpenShared=File::OpenShared || (Mode & FMF_OPENSHARED)!=0;
 | 
				
			||||||
    OpenShared=true;
 | 
					  bool UpdateMode=(Mode & FMF_UPDATE)!=0;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  bool WriteMode=(Mode & FMF_WRITE)!=0;
 | 
				
			||||||
  uint Access=GENERIC_READ;
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  if (Update)
 | 
					  uint Access=WriteMode ? GENERIC_WRITE:GENERIC_READ;
 | 
				
			||||||
 | 
					  if (UpdateMode)
 | 
				
			||||||
    Access|=GENERIC_WRITE;
 | 
					    Access|=GENERIC_WRITE;
 | 
				
			||||||
  uint ShareMode=FILE_SHARE_READ;
 | 
					  uint ShareMode=(Mode & FMF_OPENEXCLUSIVE) ? 0 : FILE_SHARE_READ;
 | 
				
			||||||
  if (OpenShared)
 | 
					  if (OpenShared)
 | 
				
			||||||
    ShareMode|=FILE_SHARE_WRITE;
 | 
					    ShareMode|=FILE_SHARE_WRITE;
 | 
				
			||||||
  uint Flags=NoSequentialRead ? 0:FILE_FLAG_SEQUENTIAL_SCAN;
 | 
					  uint Flags=NoSequentialRead ? 0:FILE_FLAG_SEQUENTIAL_SCAN;
 | 
				
			||||||
  if (WinNT() && NameW!=NULL && *NameW!=0)
 | 
					  FindData FD;
 | 
				
			||||||
    hNewFile=CreateFileW(NameW,Access,ShareMode,NULL,OPEN_EXISTING,Flags,NULL);
 | 
					  if (PreserveAtime)
 | 
				
			||||||
  else
 | 
					    Access|=FILE_WRITE_ATTRIBUTES; // Needed to preserve atime.
 | 
				
			||||||
    hNewFile=CreateFile(Name,Access,ShareMode,NULL,OPEN_EXISTING,Flags,NULL);
 | 
					  hNewFile=CreateFile(Name,Access,ShareMode,NULL,OPEN_EXISTING,Flags,NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (hNewFile==BAD_HANDLE && GetLastError()==ERROR_FILE_NOT_FOUND)
 | 
					  DWORD LastError;
 | 
				
			||||||
 | 
					  if (hNewFile==FILE_BAD_HANDLE)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    LastError=GetLastError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wchar LongName[NM];
 | 
				
			||||||
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      hNewFile=CreateFile(LongName,Access,ShareMode,NULL,OPEN_EXISTING,Flags,NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // For archive names longer than 260 characters first CreateFile
 | 
				
			||||||
 | 
					      // (without \\?\) fails and sets LastError to 3 (access denied).
 | 
				
			||||||
 | 
					      // We need the correct "file not found" error code to decide
 | 
				
			||||||
 | 
					      // if we create a new archive or quit with "cannot create" error.
 | 
				
			||||||
 | 
					      // So we need to check the error code after \\?\ CreateFile again,
 | 
				
			||||||
 | 
					      // otherwise we'll fail to create new archives with long names.
 | 
				
			||||||
 | 
					      // But we cannot simply assign the new code to LastError,
 | 
				
			||||||
 | 
					      // because it would break "..\arcname.rar" relative names processing.
 | 
				
			||||||
 | 
					      // First CreateFile returns the correct "file not found" code for such
 | 
				
			||||||
 | 
					      // names, but "\\?\" CreateFile returns ERROR_INVALID_NAME treating
 | 
				
			||||||
 | 
					      // dots as a directory name. So we check only for "file not found"
 | 
				
			||||||
 | 
					      // error here and for other errors use the first CreateFile result.
 | 
				
			||||||
 | 
					      if (GetLastError()==ERROR_FILE_NOT_FOUND)
 | 
				
			||||||
 | 
					        LastError=ERROR_FILE_NOT_FOUND;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (hNewFile==FILE_BAD_HANDLE && LastError==ERROR_FILE_NOT_FOUND)
 | 
				
			||||||
    ErrorType=FILE_NOTFOUND;
 | 
					    ErrorType=FILE_NOTFOUND;
 | 
				
			||||||
 | 
					  if (PreserveAtime && hNewFile!=FILE_BAD_HANDLE)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    FILETIME ft={0xffffffff,0xffffffff}; // This value prevents atime modification.
 | 
				
			||||||
 | 
					    SetFileTime(hNewFile,NULL,&ft,NULL);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  int flags=Update ? O_RDWR:O_RDONLY;
 | 
					  int flags=UpdateMode ? O_RDWR:(WriteMode ? O_WRONLY:O_RDONLY);
 | 
				
			||||||
#ifdef O_BINARY
 | 
					#ifdef O_BINARY
 | 
				
			||||||
  flags|=O_BINARY;
 | 
					  flags|=O_BINARY;
 | 
				
			||||||
#if defined(_AIX) && defined(_LARGE_FILE_API)
 | 
					#if defined(_AIX) && defined(_LARGE_FILE_API)
 | 
				
			||||||
  flags|=O_LARGEFILE;
 | 
					  flags|=O_LARGEFILE;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined(_EMX) && !defined(_DJGPP)
 | 
					  // NDK r20 has O_NOATIME, but fails to create files with it in Android 7+.
 | 
				
			||||||
  int sflags=OpenShared ? SH_DENYNO:SH_DENYWR;
 | 
					#if defined(O_NOATIME)
 | 
				
			||||||
  int handle=sopen(Name,flags,sflags);
 | 
					  if (PreserveAtime)
 | 
				
			||||||
#else
 | 
					    flags|=O_NOATIME;
 | 
				
			||||||
  int handle=open(Name,flags);
 | 
					#endif
 | 
				
			||||||
 | 
					  char NameA[NM];
 | 
				
			||||||
 | 
					  WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int handle=open(NameA,flags);
 | 
				
			||||||
#ifdef LOCK_EX
 | 
					#ifdef LOCK_EX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _OSF_SOURCE
 | 
					#ifdef _OSF_SOURCE
 | 
				
			||||||
  extern "C" int flock(int, int);
 | 
					  extern "C" int flock(int, int);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!OpenShared && Update && handle>=0 && flock(handle,LOCK_EX|LOCK_NB)==-1)
 | 
					  if (!OpenShared && UpdateMode && handle>=0 && flock(handle,LOCK_EX|LOCK_NB)==-1)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    close(handle);
 | 
					    close(handle);
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					  if (handle==-1)
 | 
				
			||||||
 | 
					    hNewFile=FILE_BAD_HANDLE;
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
 | 
					    hNewFile=handle;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    hNewFile=fdopen(handle,UpdateMode ? UPDATEBINARY:READBINARY);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  hNewFile=handle==-1 ? BAD_HANDLE:fdopen(handle,Update ? UPDATEBINARY:READBINARY);
 | 
					  }
 | 
				
			||||||
  if (hNewFile==BAD_HANDLE && errno==ENOENT)
 | 
					  if (hNewFile==FILE_BAD_HANDLE && errno==ENOENT)
 | 
				
			||||||
    ErrorType=FILE_NOTFOUND;
 | 
					    ErrorType=FILE_NOTFOUND;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  NewFile=false;
 | 
					  NewFile=false;
 | 
				
			||||||
  HandleType=FILE_HANDLENORMAL;
 | 
					  HandleType=FILE_HANDLENORMAL;
 | 
				
			||||||
  SkipClose=false;
 | 
					  SkipClose=false;
 | 
				
			||||||
  bool Success=hNewFile!=BAD_HANDLE;
 | 
					  bool Success=hNewFile!=FILE_BAD_HANDLE;
 | 
				
			||||||
  if (Success)
 | 
					  if (Success)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    hFile=hNewFile;
 | 
					    hFile=hNewFile;
 | 
				
			||||||
    if (NameW!=NULL)
 | 
					    wcsncpyz(FileName,Name,ASIZE(FileName));
 | 
				
			||||||
      strcpyw(FileNameW,NameW);
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      *FileNameW=0;
 | 
					 | 
				
			||||||
    if (Name!=NULL)
 | 
					 | 
				
			||||||
      strcpy(FileName,Name);
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      WideToChar(NameW,FileName);
 | 
					 | 
				
			||||||
    AddFileToList(hFile);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(Success);
 | 
					  return Success;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(SHELL_EXT) && !defined(SFX_MODULE)
 | 
					#if !defined(SFX_MODULE)
 | 
				
			||||||
void File::TOpen(const char *Name,const wchar *NameW)
 | 
					void File::TOpen(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (!WOpen(Name,NameW))
 | 
					  if (!WOpen(Name))
 | 
				
			||||||
    ErrHandler.Exit(OPEN_ERROR);
 | 
					    ErrHandler.Exit(RARX_OPEN);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::WOpen(const char *Name,const wchar *NameW)
 | 
					bool File::WOpen(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Open(Name,NameW))
 | 
					  if (Open(Name))
 | 
				
			||||||
    return(true);
 | 
					    return true;
 | 
				
			||||||
  ErrHandler.OpenErrorMsg(Name);
 | 
					  ErrHandler.OpenErrorMsg(Name);
 | 
				
			||||||
  return(false);
 | 
					  return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::Create(const char *Name,const wchar *NameW,bool ShareRead)
 | 
					bool File::Create(const wchar *Name,uint Mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  // OpenIndiana based NAS and CIFS shares fail to set the file time if file
 | 
				
			||||||
  DWORD ShareMode=(ShareRead || File::OpenShared) ? FILE_SHARE_READ:0;
 | 
					  // was created in read+write mode and some data was written and not flushed
 | 
				
			||||||
  if (WinNT() && NameW!=NULL && *NameW!=0)
 | 
					  // before SetFileTime call. So we should use the write only mode if we plan
 | 
				
			||||||
    hFile=CreateFileW(NameW,GENERIC_READ|GENERIC_WRITE,ShareMode,NULL,
 | 
					  // SetFileTime call and do not need to read from file.
 | 
				
			||||||
                      CREATE_ALWAYS,0,NULL);
 | 
					  bool WriteMode=(Mode & FMF_WRITE)!=0;
 | 
				
			||||||
 | 
					  bool ShareRead=(Mode & FMF_SHAREREAD)!=0 || File::OpenShared;
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  CreateMode=Mode;
 | 
				
			||||||
 | 
					  uint Access=WriteMode ? GENERIC_WRITE:GENERIC_READ|GENERIC_WRITE;
 | 
				
			||||||
 | 
					  DWORD ShareMode=ShareRead ? FILE_SHARE_READ:0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Windows automatically removes dots and spaces in the end of file name,
 | 
				
			||||||
 | 
					  // So we detect such names and process them with \\?\ prefix.
 | 
				
			||||||
 | 
					  wchar *LastChar=PointToLastChar(Name);
 | 
				
			||||||
 | 
					  bool Special=*LastChar=='.' || *LastChar==' ';
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  if (Special && (Mode & FMF_STANDARDNAMES)==0)
 | 
				
			||||||
 | 
					    hFile=FILE_BAD_HANDLE;
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    hFile=CreateFile(Name,GENERIC_READ|GENERIC_WRITE,ShareMode,NULL,
 | 
					    hFile=CreateFile(Name,Access,ShareMode,NULL,CREATE_ALWAYS,0,NULL);
 | 
				
			||||||
                     CREATE_ALWAYS,0,NULL);
 | 
					
 | 
				
			||||||
 | 
					  if (hFile==FILE_BAD_HANDLE)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wchar LongName[NM];
 | 
				
			||||||
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
 | 
					      hFile=CreateFile(LongName,Access,ShareMode,NULL,CREATE_ALWAYS,0,NULL);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  hFile=fopen(Name,CREATEBINARY);
 | 
					  char NameA[NM];
 | 
				
			||||||
 | 
					  WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
 | 
					  hFile=open(NameA,(O_CREAT|O_TRUNC) | (WriteMode ? O_WRONLY : O_RDWR),0666);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  hFile=fopen(NameA,WriteMode ? WRITEBINARY:CREATEBINARY);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  NewFile=true;
 | 
					  NewFile=true;
 | 
				
			||||||
  HandleType=FILE_HANDLENORMAL;
 | 
					  HandleType=FILE_HANDLENORMAL;
 | 
				
			||||||
  SkipClose=false;
 | 
					  SkipClose=false;
 | 
				
			||||||
  if (NameW!=NULL)
 | 
					  wcsncpyz(FileName,Name,ASIZE(FileName));
 | 
				
			||||||
    strcpyw(FileNameW,NameW);
 | 
					  return hFile!=FILE_BAD_HANDLE;
 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    *FileNameW=0;
 | 
					 | 
				
			||||||
  if (Name!=NULL)
 | 
					 | 
				
			||||||
    strcpy(FileName,Name);
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    WideToChar(NameW,FileName);
 | 
					 | 
				
			||||||
  AddFileToList(hFile);
 | 
					 | 
				
			||||||
  return(hFile!=BAD_HANDLE);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void File::AddFileToList(FileHandle hFile)
 | 
					#if !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					void File::TCreate(const wchar *Name,uint Mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (hFile!=BAD_HANDLE)
 | 
					  if (!WCreate(Name,Mode))
 | 
				
			||||||
    for (int I=0;I<sizeof(CreatedFiles)/sizeof(CreatedFiles[0]);I++)
 | 
					    ErrHandler.Exit(RARX_FATAL);
 | 
				
			||||||
      if (CreatedFiles[I]==NULL)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        CreatedFiles[I]=this;
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(SHELL_EXT) && !defined(SFX_MODULE)
 | 
					 | 
				
			||||||
void File::TCreate(const char *Name,const wchar *NameW,bool ShareRead)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (!WCreate(Name,NameW,ShareRead))
 | 
					 | 
				
			||||||
    ErrHandler.Exit(FATAL_ERROR);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::WCreate(const char *Name,const wchar *NameW,bool ShareRead)
 | 
					bool File::WCreate(const wchar *Name,uint Mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Create(Name,NameW,ShareRead))
 | 
					  if (Create(Name,Mode))
 | 
				
			||||||
    return(true);
 | 
					    return true;
 | 
				
			||||||
  ErrHandler.SetErrorCode(CREATE_ERROR);
 | 
					 | 
				
			||||||
  ErrHandler.CreateErrorMsg(Name);
 | 
					  ErrHandler.CreateErrorMsg(Name);
 | 
				
			||||||
  return(false);
 | 
					  return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::Close()
 | 
					bool File::Close()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  bool Success=true;
 | 
					  bool Success=true;
 | 
				
			||||||
  if (HandleType!=FILE_HANDLENORMAL)
 | 
					
 | 
				
			||||||
    HandleType=FILE_HANDLENORMAL;
 | 
					  if (hFile!=FILE_BAD_HANDLE)
 | 
				
			||||||
  else
 | 
					  {
 | 
				
			||||||
    if (hFile!=BAD_HANDLE)
 | 
					    if (!SkipClose)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      if (!SkipClose)
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
      {
 | 
					      // We use the standard system handle for stdout in Windows
 | 
				
			||||||
#ifdef _WIN_32
 | 
					      // and it must not be closed here.
 | 
				
			||||||
 | 
					      if (HandleType==FILE_HANDLENORMAL)
 | 
				
			||||||
        Success=CloseHandle(hFile)==TRUE;
 | 
					        Success=CloseHandle(hFile)==TRUE;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        Success=fclose(hFile)!=EOF;
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
#endif
 | 
					      Success=close(hFile)!=-1;
 | 
				
			||||||
        if (Success || !RemoveCreatedActive)
 | 
					 | 
				
			||||||
          for (int I=0;I<sizeof(CreatedFiles)/sizeof(CreatedFiles[0]);I++)
 | 
					 | 
				
			||||||
            if (CreatedFiles[I]==this)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              CreatedFiles[I]=NULL;
 | 
					 | 
				
			||||||
              break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      hFile=BAD_HANDLE;
 | 
					 | 
				
			||||||
      if (!Success && AllowExceptions)
 | 
					 | 
				
			||||||
        ErrHandler.CloseError(FileName);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  CloseCount++;
 | 
					 | 
				
			||||||
  return(Success);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void File::Flush()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  FlushFileBuffers(hFile);
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  fflush(hFile);
 | 
					      Success=fclose(hFile)!=EOF;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    hFile=FILE_BAD_HANDLE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  HandleType=FILE_HANDLENORMAL;
 | 
				
			||||||
 | 
					  if (!Success && AllowExceptions)
 | 
				
			||||||
 | 
					    ErrHandler.CloseError(FileName);
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::Delete()
 | 
					bool File::Delete()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (HandleType!=FILE_HANDLENORMAL)
 | 
					  if (HandleType!=FILE_HANDLENORMAL)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  if (hFile!=BAD_HANDLE)
 | 
					  if (hFile!=FILE_BAD_HANDLE)
 | 
				
			||||||
    Close();
 | 
					    Close();
 | 
				
			||||||
  if (!AllowDelete)
 | 
					  if (!AllowDelete)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  return(DelFile(FileName,FileNameW));
 | 
					  return DelFile(FileName);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::Rename(const char *NewName,const wchar *NewNameW)
 | 
					bool File::Rename(const wchar *NewName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // we do not need to rename if names are already same
 | 
					  // No need to rename if names are already same.
 | 
				
			||||||
  bool Success=strcmp(FileName,NewName)==0;
 | 
					  bool Success=wcscmp(FileName,NewName)==0;
 | 
				
			||||||
  if (Success && *FileNameW!=0 && *NullToEmpty(NewNameW)!=0)
 | 
					 | 
				
			||||||
    Success=strcmpw(FileNameW,NewNameW)==0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!Success)
 | 
					  if (!Success)
 | 
				
			||||||
    Success=RenameFile(FileName,FileNameW,NewName,NewNameW);
 | 
					    Success=RenameFile(FileName,NewName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Success)
 | 
					  if (Success)
 | 
				
			||||||
  {
 | 
					    wcsncpyz(FileName,NewName,ASIZE(FileName));
 | 
				
			||||||
    // renamed successfully, storing the new name
 | 
					
 | 
				
			||||||
    strcpy(FileName,NewName);
 | 
					  return Success;
 | 
				
			||||||
    strcpyw(FileNameW,NullToEmpty(NewNameW));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return(Success);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void File::Write(const void *Data,size_t Size)
 | 
					bool File::Write(const void *Data,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Size==0)
 | 
					  if (Size==0)
 | 
				
			||||||
    return;
 | 
					    return true;
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					  if (HandleType==FILE_HANDLESTD)
 | 
				
			||||||
  if (HandleType!=FILE_HANDLENORMAL)
 | 
					  {
 | 
				
			||||||
    switch(HandleType)
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					    hFile=GetStdHandle(STD_OUTPUT_HANDLE);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    // Cannot use the standard stdout here, because it already has wide orientation.
 | 
				
			||||||
 | 
					    if (hFile==FILE_BAD_HANDLE)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      case FILE_HANDLESTD:
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
#ifdef _WIN_32
 | 
					      hFile=dup(STDOUT_FILENO); // Open new stdout stream.
 | 
				
			||||||
        hFile=GetStdHandle(STD_OUTPUT_HANDLE);
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        hFile=stdout;
 | 
					      hFile=fdopen(dup(STDOUT_FILENO),"w"); // Open new stdout stream.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      case FILE_HANDLEERR:
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
        hFile=GetStdHandle(STD_ERROR_HANDLE);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        hFile=stderr;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  bool Success;
 | 
				
			||||||
  while (1)
 | 
					  while (1)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    bool Success=false;
 | 
					    Success=false;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    DWORD Written=0;
 | 
					    DWORD Written=0;
 | 
				
			||||||
    if (HandleType!=FILE_HANDLENORMAL)
 | 
					    if (HandleType!=FILE_HANDLENORMAL)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      // writing to stdout can fail in old Windows if data block is too large
 | 
					      // writing to stdout can fail in old Windows if data block is too large
 | 
				
			||||||
      const size_t MaxSize=0x4000;
 | 
					      const size_t MaxSize=0x4000;
 | 
				
			||||||
      for (size_t I=0;I<Size;I+=MaxSize)
 | 
					      for (size_t I=0;I<Size;I+=MaxSize)
 | 
				
			||||||
	  {
 | 
					      {
 | 
				
			||||||
        Success=WriteFile(hFile,(byte *)Data+I,(DWORD)Min(Size-I,MaxSize),&Written,NULL)==TRUE;
 | 
					        Success=WriteFile(hFile,(byte *)Data+I,(DWORD)Min(Size-I,MaxSize),&Written,NULL)==TRUE;
 | 
				
			||||||
        if (!Success)
 | 
					        if (!Success)
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
	  }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      Success=WriteFile(hFile,Data,(DWORD)Size,&Written,NULL)==TRUE;
 | 
					      Success=WriteFile(hFile,Data,(DWORD)Size,&Written,NULL)==TRUE;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
 | 
					    ssize_t Written=write(hFile,Data,Size);
 | 
				
			||||||
 | 
					    Success=Written==Size;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    int Written=fwrite(Data,1,Size,hFile);
 | 
					    int Written=fwrite(Data,1,Size,hFile);
 | 
				
			||||||
    Success=Written==Size && !ferror(hFile);
 | 
					    Success=Written==Size && !ferror(hFile);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    if (!Success && AllowExceptions && HandleType==FILE_HANDLENORMAL)
 | 
					    if (!Success && AllowExceptions && HandleType==FILE_HANDLENORMAL)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(RARDLL)
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(RARDLL)
 | 
				
			||||||
      int ErrCode=GetLastError();
 | 
					      int ErrCode=GetLastError();
 | 
				
			||||||
      int64 FilePos=Tell();
 | 
					      int64 FilePos=Tell();
 | 
				
			||||||
      uint64 FreeSize=GetFreeDisk(FileName);
 | 
					      uint64 FreeSize=GetFreeDisk(FileName);
 | 
				
			||||||
| 
						 | 
					@ -327,7 +351,7 @@ void File::Write(const void *Data,size_t Size)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
      if (ErrHandler.AskRepeatWrite(FileName,false))
 | 
					      if (ErrHandler.AskRepeatWrite(FileName,false))
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
#ifndef _WIN_32
 | 
					#if !defined(_WIN_ALL) && !defined(FILE_USE_OPEN)
 | 
				
			||||||
        clearerr(hFile);
 | 
					        clearerr(hFile);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        if (Written<Size && Written>0)
 | 
					        if (Written<Size && Written>0)
 | 
				
			||||||
| 
						 | 
					@ -339,12 +363,13 @@ void File::Write(const void *Data,size_t Size)
 | 
				
			||||||
    break;
 | 
					    break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  LastWrite=true;
 | 
					  LastWrite=true;
 | 
				
			||||||
 | 
					  return Success; // It can return false only if AllowExceptions is disabled.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int File::Read(void *Data,size_t Size)
 | 
					int File::Read(void *Data,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int64 FilePos=0; //initialized only to suppress some compilers warning
 | 
					  int64 FilePos=0; // Initialized only to suppress some compilers warning.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (IgnoreReadErrors)
 | 
					  if (IgnoreReadErrors)
 | 
				
			||||||
    FilePos=Tell();
 | 
					    FilePos=Tell();
 | 
				
			||||||
| 
						 | 
					@ -376,39 +401,61 @@ int File::Read(void *Data,size_t Size)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    break;
 | 
					    break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(ReadSize);
 | 
					  return ReadSize; // It can return -1 only if AllowExceptions is disabled.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns -1 in case of error.
 | 
					// Returns -1 in case of error.
 | 
				
			||||||
int File::DirectRead(void *Data,size_t Size)
 | 
					int File::DirectRead(void *Data,size_t Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  const size_t MaxDeviceRead=20000;
 | 
					  const size_t MaxDeviceRead=20000;
 | 
				
			||||||
 | 
					  const size_t MaxLockedRead=32768;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
  if (HandleType==FILE_HANDLESTD)
 | 
					  if (HandleType==FILE_HANDLESTD)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    if (Size>MaxDeviceRead)
 | 
					//    if (Size>MaxDeviceRead)
 | 
				
			||||||
      Size=MaxDeviceRead;
 | 
					//      Size=MaxDeviceRead;
 | 
				
			||||||
    hFile=GetStdHandle(STD_INPUT_HANDLE);
 | 
					    hFile=GetStdHandle(STD_INPUT_HANDLE);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
 | 
					    hFile=STDIN_FILENO;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    hFile=stdin;
 | 
					    hFile=stdin;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  }
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  // For pipes like 'type file.txt | rar -si arcname' ReadFile may return
 | 
				
			||||||
 | 
					  // data in small ~4KB blocks. It may slightly reduce the compression ratio.
 | 
				
			||||||
  DWORD Read;
 | 
					  DWORD Read;
 | 
				
			||||||
  if (!ReadFile(hFile,Data,(DWORD)Size,&Read,NULL))
 | 
					  if (!ReadFile(hFile,Data,(DWORD)Size,&Read,NULL))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (IsDevice() && Size>MaxDeviceRead)
 | 
					    if (IsDevice() && Size>MaxDeviceRead)
 | 
				
			||||||
      return(DirectRead(Data,MaxDeviceRead));
 | 
					      return DirectRead(Data,MaxDeviceRead);
 | 
				
			||||||
    if (HandleType==FILE_HANDLESTD && GetLastError()==ERROR_BROKEN_PIPE)
 | 
					    if (HandleType==FILE_HANDLESTD && GetLastError()==ERROR_BROKEN_PIPE)
 | 
				
			||||||
      return(0);
 | 
					      return 0;
 | 
				
			||||||
    return(-1);
 | 
					
 | 
				
			||||||
 | 
					    // We had a bug report about failure to archive 1C database lock file
 | 
				
			||||||
 | 
					    // 1Cv8tmp.1CL, which is a zero length file with a region above 200 KB
 | 
				
			||||||
 | 
					    // permanently locked. If our first read request uses too large buffer
 | 
				
			||||||
 | 
					    // and if we are in -dh mode, so we were able to open the file,
 | 
				
			||||||
 | 
					    // we'll fail with "Read error". So now we use try a smaller buffer size
 | 
				
			||||||
 | 
					    // in case of lock error.
 | 
				
			||||||
 | 
					    if (HandleType==FILE_HANDLENORMAL && Size>MaxLockedRead &&
 | 
				
			||||||
 | 
					        GetLastError()==ERROR_LOCK_VIOLATION)
 | 
				
			||||||
 | 
					      return DirectRead(Data,MaxLockedRead);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(Read);
 | 
					  return Read;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
 | 
					  ssize_t ReadSize=read(hFile,Data,Size);
 | 
				
			||||||
 | 
					  if (ReadSize==-1)
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  return (int)ReadSize;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  if (LastWrite)
 | 
					  if (LastWrite)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					@ -418,8 +465,9 @@ int File::DirectRead(void *Data,size_t Size)
 | 
				
			||||||
  clearerr(hFile);
 | 
					  clearerr(hFile);
 | 
				
			||||||
  size_t ReadSize=fread(Data,1,Size,hFile);
 | 
					  size_t ReadSize=fread(Data,1,Size,hFile);
 | 
				
			||||||
  if (ferror(hFile))
 | 
					  if (ferror(hFile))
 | 
				
			||||||
    return(-1);
 | 
					    return -1;
 | 
				
			||||||
  return((int)ReadSize);
 | 
					  return (int)ReadSize;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -433,47 +481,58 @@ void File::Seek(int64 Offset,int Method)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::RawSeek(int64 Offset,int Method)
 | 
					bool File::RawSeek(int64 Offset,int Method)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (hFile==BAD_HANDLE)
 | 
					  if (hFile==FILE_BAD_HANDLE)
 | 
				
			||||||
    return(true);
 | 
					    return true;
 | 
				
			||||||
  if (Offset<0 && Method!=SEEK_SET)
 | 
					  if (Offset<0 && Method!=SEEK_SET)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    Offset=(Method==SEEK_CUR ? Tell():FileLength())+Offset;
 | 
					    Offset=(Method==SEEK_CUR ? Tell():FileLength())+Offset;
 | 
				
			||||||
    Method=SEEK_SET;
 | 
					    Method=SEEK_SET;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  LONG HighDist=(LONG)(Offset>>32);
 | 
					  LONG HighDist=(LONG)(Offset>>32);
 | 
				
			||||||
  if (SetFilePointer(hFile,(LONG)Offset,&HighDist,Method)==0xffffffff &&
 | 
					  if (SetFilePointer(hFile,(LONG)Offset,&HighDist,Method)==0xffffffff &&
 | 
				
			||||||
      GetLastError()!=NO_ERROR)
 | 
					      GetLastError()!=NO_ERROR)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  LastWrite=false;
 | 
					  LastWrite=false;
 | 
				
			||||||
#if defined(_LARGEFILE_SOURCE) && !defined(_OSF_SOURCE) && !defined(__VMS)
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
 | 
					  if (lseek(hFile,(off_t)Offset,Method)==-1)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					#elif defined(_LARGEFILE_SOURCE) && !defined(_OSF_SOURCE) && !defined(__VMS)
 | 
				
			||||||
  if (fseeko(hFile,Offset,Method)!=0)
 | 
					  if (fseeko(hFile,Offset,Method)!=0)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  if (fseek(hFile,(long)Offset,Method)!=0)
 | 
					  if (fseek(hFile,(long)Offset,Method)!=0)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  return(true);
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int64 File::Tell()
 | 
					int64 File::Tell()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  if (hFile==FILE_BAD_HANDLE)
 | 
				
			||||||
 | 
					    if (AllowExceptions)
 | 
				
			||||||
 | 
					      ErrHandler.SeekError(FileName);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  LONG HighDist=0;
 | 
					  LONG HighDist=0;
 | 
				
			||||||
  uint LowDist=SetFilePointer(hFile,0,&HighDist,FILE_CURRENT);
 | 
					  uint LowDist=SetFilePointer(hFile,0,&HighDist,FILE_CURRENT);
 | 
				
			||||||
  if (LowDist==0xffffffff && GetLastError()!=NO_ERROR)
 | 
					  if (LowDist==0xffffffff && GetLastError()!=NO_ERROR)
 | 
				
			||||||
    if (AllowExceptions)
 | 
					    if (AllowExceptions)
 | 
				
			||||||
      ErrHandler.SeekError(FileName);
 | 
					      ErrHandler.SeekError(FileName);
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      return(-1);
 | 
					      return -1;
 | 
				
			||||||
  return(INT32TO64(HighDist,LowDist));
 | 
					  return INT32TO64(HighDist,LowDist);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#if defined(_LARGEFILE_SOURCE) && !defined(_OSF_SOURCE)
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
  return(ftello(hFile));
 | 
					  return lseek(hFile,0,SEEK_CUR);
 | 
				
			||||||
 | 
					#elif defined(_LARGEFILE_SOURCE) && !defined(_OSF_SOURCE)
 | 
				
			||||||
 | 
					  return ftello(hFile);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return(ftell(hFile));
 | 
					  return ftell(hFile);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -481,13 +540,21 @@ int64 File::Tell()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void File::Prealloc(int64 Size)
 | 
					void File::Prealloc(int64 Size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  if (RawSeek(Size,SEEK_SET))
 | 
					  if (RawSeek(Size,SEEK_SET))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    Truncate();
 | 
					    Truncate();
 | 
				
			||||||
    Seek(0,SEEK_SET);
 | 
					    Seek(0,SEEK_SET);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_UNIX) && defined(USE_FALLOCATE)
 | 
				
			||||||
 | 
					  // fallocate is rather new call. Only latest kernels support it.
 | 
				
			||||||
 | 
					  // So we are not using it by default yet.
 | 
				
			||||||
 | 
					  int fd = GetFD();
 | 
				
			||||||
 | 
					  if (fd >= 0)
 | 
				
			||||||
 | 
					    fallocate(fd, 0, 0, Size);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -495,7 +562,7 @@ byte File::GetByte()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  byte Byte=0;
 | 
					  byte Byte=0;
 | 
				
			||||||
  Read(&Byte,1);
 | 
					  Read(&Byte,1);
 | 
				
			||||||
  return(Byte);
 | 
					  return Byte;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -507,27 +574,46 @@ void File::PutByte(byte Byte)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::Truncate()
 | 
					bool File::Truncate()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  return(SetEndOfFile(hFile)==TRUE);
 | 
					  return SetEndOfFile(hFile)==TRUE;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return(false);
 | 
					  return ftruncate(GetFD(),(off_t)Tell())==0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void File::Flush()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  FlushFileBuffers(hFile);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifndef FILE_USE_OPEN
 | 
				
			||||||
 | 
					  fflush(hFile);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  fsync(GetFD());
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void File::SetOpenFileTime(RarTime *ftm,RarTime *ftc,RarTime *fta)
 | 
					void File::SetOpenFileTime(RarTime *ftm,RarTime *ftc,RarTime *fta)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  // Workaround for OpenIndiana NAS time bug. If we cannot create a file
 | 
				
			||||||
 | 
					  // in write only mode, we need to flush the write buffer before calling
 | 
				
			||||||
 | 
					  // SetFileTime or file time will not be changed.
 | 
				
			||||||
 | 
					  if (CreateMode!=FMF_UNDEFINED && (CreateMode & FMF_WRITE)==0)
 | 
				
			||||||
 | 
					    FlushFileBuffers(hFile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool sm=ftm!=NULL && ftm->IsSet();
 | 
					  bool sm=ftm!=NULL && ftm->IsSet();
 | 
				
			||||||
  bool sc=ftc!=NULL && ftc->IsSet();
 | 
					  bool sc=ftc!=NULL && ftc->IsSet();
 | 
				
			||||||
  bool sa=fta!=NULL && fta->IsSet();
 | 
					  bool sa=fta!=NULL && fta->IsSet();
 | 
				
			||||||
  FILETIME fm,fc,fa;
 | 
					  FILETIME fm,fc,fa;
 | 
				
			||||||
  if (sm)
 | 
					  if (sm)
 | 
				
			||||||
    ftm->GetWin32(&fm);
 | 
					    ftm->GetWinFT(&fm);
 | 
				
			||||||
  if (sc)
 | 
					  if (sc)
 | 
				
			||||||
    ftc->GetWin32(&fc);
 | 
					    ftc->GetWinFT(&fc);
 | 
				
			||||||
  if (sa)
 | 
					  if (sa)
 | 
				
			||||||
    fta->GetWin32(&fa);
 | 
					    fta->GetWinFT(&fa);
 | 
				
			||||||
  SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL);
 | 
					  SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -535,29 +621,47 @@ void File::SetOpenFileTime(RarTime *ftm,RarTime *ftc,RarTime *fta)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void File::SetCloseFileTime(RarTime *ftm,RarTime *fta)
 | 
					void File::SetCloseFileTime(RarTime *ftm,RarTime *fta)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_UNIX) || defined(_EMX)
 | 
					// Android APP_PLATFORM := android-14 does not support futimens and futimes.
 | 
				
			||||||
 | 
					// Newer platforms support futimens, but fail on Android 4.2.
 | 
				
			||||||
 | 
					// We have to use utime for Android.
 | 
				
			||||||
 | 
					// Also we noticed futimens fail to set timestamps on NTFS partition
 | 
				
			||||||
 | 
					// mounted to virtual Linux x86 machine, but utimensat worked correctly.
 | 
				
			||||||
 | 
					// So we set timestamps for already closed files in Unix.
 | 
				
			||||||
 | 
					#ifdef _UNIX
 | 
				
			||||||
  SetCloseFileTimeByName(FileName,ftm,fta);
 | 
					  SetCloseFileTimeByName(FileName,ftm,fta);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void File::SetCloseFileTimeByName(const char *Name,RarTime *ftm,RarTime *fta)
 | 
					void File::SetCloseFileTimeByName(const wchar *Name,RarTime *ftm,RarTime *fta)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_UNIX) || defined(_EMX)
 | 
					#ifdef _UNIX
 | 
				
			||||||
  bool setm=ftm!=NULL && ftm->IsSet();
 | 
					  bool setm=ftm!=NULL && ftm->IsSet();
 | 
				
			||||||
  bool seta=fta!=NULL && fta->IsSet();
 | 
					  bool seta=fta!=NULL && fta->IsSet();
 | 
				
			||||||
  if (setm || seta)
 | 
					  if (setm || seta)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    struct utimbuf ut;
 | 
					    char NameA[NM];
 | 
				
			||||||
 | 
					    WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef UNIX_TIME_NS
 | 
				
			||||||
 | 
					    timespec times[2];
 | 
				
			||||||
 | 
					    times[0].tv_sec=seta ? fta->GetUnix() : 0;
 | 
				
			||||||
 | 
					    times[0].tv_nsec=seta ? long(fta->GetUnixNS()%1000000000) : UTIME_NOW;
 | 
				
			||||||
 | 
					    times[1].tv_sec=setm ? ftm->GetUnix() : 0;
 | 
				
			||||||
 | 
					    times[1].tv_nsec=setm ? long(ftm->GetUnixNS()%1000000000) : UTIME_NOW;
 | 
				
			||||||
 | 
					    utimensat(AT_FDCWD,NameA,times,0);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    utimbuf ut;
 | 
				
			||||||
    if (setm)
 | 
					    if (setm)
 | 
				
			||||||
      ut.modtime=ftm->GetUnix();
 | 
					      ut.modtime=ftm->GetUnix();
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      ut.modtime=fta->GetUnix();
 | 
					      ut.modtime=fta->GetUnix(); // Need to set something, cannot left it 0.
 | 
				
			||||||
    if (seta)
 | 
					    if (seta)
 | 
				
			||||||
      ut.actime=fta->GetUnix();
 | 
					      ut.actime=fta->GetUnix();
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      ut.actime=ut.modtime;
 | 
					      ut.actime=ut.modtime; // Need to set something, cannot left it 0.
 | 
				
			||||||
    utime(Name,&ut);
 | 
					    utime(NameA,&ut);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -565,99 +669,46 @@ void File::SetCloseFileTimeByName(const char *Name,RarTime *ftm,RarTime *fta)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void File::GetOpenFileTime(RarTime *ft)
 | 
					void File::GetOpenFileTime(RarTime *ft)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  FILETIME FileTime;
 | 
					  FILETIME FileTime;
 | 
				
			||||||
  GetFileTime(hFile,NULL,NULL,&FileTime);
 | 
					  GetFileTime(hFile,NULL,NULL,&FileTime);
 | 
				
			||||||
  *ft=FileTime;
 | 
					  ft->SetWinFT(&FileTime);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined(_UNIX) || defined(_EMX)
 | 
					#if defined(_UNIX) || defined(_EMX)
 | 
				
			||||||
  struct stat st;
 | 
					  struct stat st;
 | 
				
			||||||
  fstat(fileno(hFile),&st);
 | 
					  fstat(GetFD(),&st);
 | 
				
			||||||
  *ft=st.st_mtime;
 | 
					  ft->SetUnix(st.st_mtime);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int64 File::FileLength()
 | 
					int64 File::FileLength()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SaveFilePos SavePos(*this);
 | 
					  int64 SavePos=Tell();
 | 
				
			||||||
  Seek(0,SEEK_END);
 | 
					  Seek(0,SEEK_END);
 | 
				
			||||||
  return(Tell());
 | 
					  int64 Length=Tell();
 | 
				
			||||||
}
 | 
					  Seek(SavePos,SEEK_SET);
 | 
				
			||||||
 | 
					  return Length;
 | 
				
			||||||
 | 
					 | 
				
			||||||
void File::SetHandleType(FILE_HANDLETYPE Type)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  HandleType=Type;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool File::IsDevice()
 | 
					bool File::IsDevice()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (hFile==BAD_HANDLE)
 | 
					  if (hFile==FILE_BAD_HANDLE)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  uint Type=GetFileType(hFile);
 | 
					  uint Type=GetFileType(hFile);
 | 
				
			||||||
  return(Type==FILE_TYPE_CHAR || Type==FILE_TYPE_PIPE);
 | 
					  return Type==FILE_TYPE_CHAR || Type==FILE_TYPE_PIPE;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return(isatty(fileno(hFile)));
 | 
					  return isatty(GetFD());
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
void File::fprintf(const char *fmt,...)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  va_list argptr;
 | 
					 | 
				
			||||||
  va_start(argptr,fmt);
 | 
					 | 
				
			||||||
  safebuf char Msg[2*NM+1024],OutMsg[2*NM+1024];
 | 
					 | 
				
			||||||
  vsprintf(Msg,fmt,argptr);
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  for (int Src=0,Dest=0;;Src++)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    char CurChar=Msg[Src];
 | 
					 | 
				
			||||||
    if (CurChar=='\n')
 | 
					 | 
				
			||||||
      OutMsg[Dest++]='\r';
 | 
					 | 
				
			||||||
    OutMsg[Dest++]=CurChar;
 | 
					 | 
				
			||||||
    if (CurChar==0)
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  strcpy(OutMsg,Msg);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  Write(OutMsg,strlen(OutMsg));
 | 
					 | 
				
			||||||
  va_end(argptr);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool File::RemoveCreated()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  RemoveCreatedActive++;
 | 
					 | 
				
			||||||
  bool RetCode=true;
 | 
					 | 
				
			||||||
  for (int I=0;I<sizeof(CreatedFiles)/sizeof(CreatedFiles[0]);I++)
 | 
					 | 
				
			||||||
    if (CreatedFiles[I]!=NULL)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      CreatedFiles[I]->SetExceptions(false);
 | 
					 | 
				
			||||||
      bool Success;
 | 
					 | 
				
			||||||
      if (CreatedFiles[I]->NewFile)
 | 
					 | 
				
			||||||
        Success=CreatedFiles[I]->Delete();
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        Success=CreatedFiles[I]->Close();
 | 
					 | 
				
			||||||
      if (Success)
 | 
					 | 
				
			||||||
        CreatedFiles[I]=NULL;
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        RetCode=false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  RemoveCreatedActive--;
 | 
					 | 
				
			||||||
  return(RetCode);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
int64 File::Copy(File &Dest,int64 Length)
 | 
					int64 File::Copy(File &Dest,int64 Length)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Array<char> Buffer(0x10000);
 | 
					  Array<byte> Buffer(File::CopyBufferSize());
 | 
				
			||||||
  int64 CopySize=0;
 | 
					  int64 CopySize=0;
 | 
				
			||||||
  bool CopyAll=(Length==INT64NDF);
 | 
					  bool CopyAll=(Length==INT64NDF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -665,14 +716,30 @@ int64 File::Copy(File &Dest,int64 Length)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    Wait();
 | 
					    Wait();
 | 
				
			||||||
    size_t SizeToRead=(!CopyAll && Length<(int64)Buffer.Size()) ? (size_t)Length:Buffer.Size();
 | 
					    size_t SizeToRead=(!CopyAll && Length<(int64)Buffer.Size()) ? (size_t)Length:Buffer.Size();
 | 
				
			||||||
    int ReadSize=Read(&Buffer[0],SizeToRead);
 | 
					    byte *Buf=&Buffer[0];
 | 
				
			||||||
 | 
					    int ReadSize=Read(Buf,SizeToRead);
 | 
				
			||||||
    if (ReadSize==0)
 | 
					    if (ReadSize==0)
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    Dest.Write(&Buffer[0],ReadSize);
 | 
					    size_t WriteSize=ReadSize;
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					    // For FAT32 USB flash drives in Windows if first write is 4 KB or more,
 | 
				
			||||||
 | 
					    // write caching is disabled and "write through" is enabled, resulting
 | 
				
			||||||
 | 
					    // in bad performance, especially for many small files. It happens when
 | 
				
			||||||
 | 
					    // we create SFX archive on USB drive, because SFX module is written first.
 | 
				
			||||||
 | 
					    // So we split the first write to small 1 KB followed by rest of data.
 | 
				
			||||||
 | 
					    if (CopySize==0 && WriteSize>=4096)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      const size_t FirstWrite=1024;
 | 
				
			||||||
 | 
					      Dest.Write(Buf,FirstWrite);
 | 
				
			||||||
 | 
					      Buf+=FirstWrite;
 | 
				
			||||||
 | 
					      WriteSize-=FirstWrite;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    Dest.Write(Buf,WriteSize);
 | 
				
			||||||
    CopySize+=ReadSize;
 | 
					    CopySize+=ReadSize;
 | 
				
			||||||
    if (!CopyAll)
 | 
					    if (!CopyAll)
 | 
				
			||||||
      Length-=ReadSize;
 | 
					      Length-=ReadSize;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(CopySize);
 | 
					  return CopySize;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,34 +1,55 @@
 | 
				
			||||||
#ifndef _RAR_FILE_
 | 
					#ifndef _RAR_FILE_
 | 
				
			||||||
#define _RAR_FILE_
 | 
					#define _RAR_FILE_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#define FILE_USE_OPEN
 | 
				
			||||||
typedef HANDLE FileHandle;
 | 
					
 | 
				
			||||||
#define BAD_HANDLE INVALID_HANDLE_VALUE
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  typedef HANDLE FileHandle;
 | 
				
			||||||
 | 
					  #define FILE_BAD_HANDLE INVALID_HANDLE_VALUE
 | 
				
			||||||
 | 
					#elif defined(FILE_USE_OPEN)
 | 
				
			||||||
 | 
					  typedef off_t FileHandle;
 | 
				
			||||||
 | 
					  #define FILE_BAD_HANDLE -1
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
typedef FILE* FileHandle;
 | 
					  typedef FILE* FileHandle;
 | 
				
			||||||
#define BAD_HANDLE NULL
 | 
					  #define FILE_BAD_HANDLE NULL
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RAROptions;
 | 
					class RAROptions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum FILE_HANDLETYPE {FILE_HANDLENORMAL,FILE_HANDLESTD,FILE_HANDLEERR};
 | 
					enum FILE_HANDLETYPE {FILE_HANDLENORMAL,FILE_HANDLESTD};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum FILE_ERRORTYPE {FILE_SUCCESS,FILE_NOTFOUND,FILE_READERROR};
 | 
					enum FILE_ERRORTYPE {FILE_SUCCESS,FILE_NOTFOUND,FILE_READERROR};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct FileStat
 | 
					enum FILE_MODE_FLAGS {
 | 
				
			||||||
{
 | 
					  // Request read only access to file. Default for Open.
 | 
				
			||||||
  uint FileAttr;
 | 
					  FMF_READ=0,
 | 
				
			||||||
  uint FileTime;
 | 
					
 | 
				
			||||||
  int64 FileSize;
 | 
					  // Request both read and write access to file. Default for Create.
 | 
				
			||||||
  bool IsDir;
 | 
					  FMF_UPDATE=1,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Request write only access to file.
 | 
				
			||||||
 | 
					  FMF_WRITE=2,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Open files which are already opened for write by other programs.
 | 
				
			||||||
 | 
					  FMF_OPENSHARED=4,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Open files only if no other program is opened it even in shared mode.
 | 
				
			||||||
 | 
					  FMF_OPENEXCLUSIVE=8,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Provide read access to created file for other programs.
 | 
				
			||||||
 | 
					  FMF_SHAREREAD=16,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Use standard NTFS names without trailing dots and spaces.
 | 
				
			||||||
 | 
					  FMF_STANDARDNAMES=32,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Mode flags are not defined yet.
 | 
				
			||||||
 | 
					  FMF_UNDEFINED=256
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class File
 | 
					class File
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    void AddFileToList(FileHandle hFile);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    FileHandle hFile;
 | 
					    FileHandle hFile;
 | 
				
			||||||
    bool LastWrite;
 | 
					    bool LastWrite;
 | 
				
			||||||
    FILE_HANDLETYPE HandleType;
 | 
					    FILE_HANDLETYPE HandleType;
 | 
				
			||||||
| 
						 | 
					@ -37,62 +58,85 @@ class File
 | 
				
			||||||
    bool NewFile;
 | 
					    bool NewFile;
 | 
				
			||||||
    bool AllowDelete;
 | 
					    bool AllowDelete;
 | 
				
			||||||
    bool AllowExceptions;
 | 
					    bool AllowExceptions;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    bool NoSequentialRead;
 | 
					    bool NoSequentialRead;
 | 
				
			||||||
 | 
					    uint CreateMode;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					    bool PreserveAtime;
 | 
				
			||||||
  protected:
 | 
					  protected:
 | 
				
			||||||
    bool OpenShared;
 | 
					    bool OpenShared; // Set by 'Archive' class.
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    char FileName[NM];
 | 
					    wchar FileName[NM];
 | 
				
			||||||
    wchar FileNameW[NM];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FILE_ERRORTYPE ErrorType;
 | 
					    FILE_ERRORTYPE ErrorType;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint CloseCount;
 | 
					 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    File();
 | 
					    File();
 | 
				
			||||||
    virtual ~File();
 | 
					    virtual ~File();
 | 
				
			||||||
    void operator = (File &SrcFile);
 | 
					    void operator = (File &SrcFile);
 | 
				
			||||||
    bool Open(const char *Name,const wchar *NameW=NULL,bool OpenShared=false,bool Update=false);
 | 
					
 | 
				
			||||||
    void TOpen(const char *Name,const wchar *NameW=NULL);
 | 
					    // Several functions below are 'virtual', because they are redefined
 | 
				
			||||||
    bool WOpen(const char *Name,const wchar *NameW=NULL);
 | 
					    // by Archive for QOpen and by MultiFile for split files in WinRAR.
 | 
				
			||||||
    bool Create(const char *Name,const wchar *NameW=NULL,bool ShareRead=true);
 | 
					    virtual bool Open(const wchar *Name,uint Mode=FMF_READ);
 | 
				
			||||||
    void TCreate(const char *Name,const wchar *NameW=NULL,bool ShareRead=true);
 | 
					    void TOpen(const wchar *Name);
 | 
				
			||||||
    bool WCreate(const char *Name,const wchar *NameW=NULL,bool ShareRead=true);
 | 
					    bool WOpen(const wchar *Name);
 | 
				
			||||||
    bool Close();
 | 
					    bool Create(const wchar *Name,uint Mode=FMF_UPDATE|FMF_SHAREREAD);
 | 
				
			||||||
    void Flush();
 | 
					    void TCreate(const wchar *Name,uint Mode=FMF_UPDATE|FMF_SHAREREAD);
 | 
				
			||||||
 | 
					    bool WCreate(const wchar *Name,uint Mode=FMF_UPDATE|FMF_SHAREREAD);
 | 
				
			||||||
 | 
					    virtual bool Close(); // 'virtual' for MultiFile class.
 | 
				
			||||||
    bool Delete();
 | 
					    bool Delete();
 | 
				
			||||||
    bool Rename(const char *NewName,const wchar *NewNameW=NULL);
 | 
					    bool Rename(const wchar *NewName);
 | 
				
			||||||
    void Write(const void *Data,size_t Size);
 | 
					    bool Write(const void *Data,size_t Size);
 | 
				
			||||||
    int Read(void *Data,size_t Size);
 | 
					    virtual int Read(void *Data,size_t Size);
 | 
				
			||||||
    int DirectRead(void *Data,size_t Size);
 | 
					    int DirectRead(void *Data,size_t Size);
 | 
				
			||||||
    void Seek(int64 Offset,int Method);
 | 
					    virtual void Seek(int64 Offset,int Method);
 | 
				
			||||||
    bool RawSeek(int64 Offset,int Method);
 | 
					    bool RawSeek(int64 Offset,int Method);
 | 
				
			||||||
    int64 Tell();
 | 
					    virtual int64 Tell();
 | 
				
			||||||
    void Prealloc(int64 Size);
 | 
					    void Prealloc(int64 Size);
 | 
				
			||||||
    byte GetByte();
 | 
					    byte GetByte();
 | 
				
			||||||
    void PutByte(byte Byte);
 | 
					    void PutByte(byte Byte);
 | 
				
			||||||
    bool Truncate();
 | 
					    bool Truncate();
 | 
				
			||||||
 | 
					    void Flush();
 | 
				
			||||||
    void SetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL);
 | 
					    void SetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL);
 | 
				
			||||||
    void SetCloseFileTime(RarTime *ftm,RarTime *fta=NULL);
 | 
					    void SetCloseFileTime(RarTime *ftm,RarTime *fta=NULL);
 | 
				
			||||||
    static void SetCloseFileTimeByName(const char *Name,RarTime *ftm,RarTime *fta);
 | 
					    static void SetCloseFileTimeByName(const wchar *Name,RarTime *ftm,RarTime *fta);
 | 
				
			||||||
    void GetOpenFileTime(RarTime *ft);
 | 
					    void GetOpenFileTime(RarTime *ft);
 | 
				
			||||||
    bool IsOpened() {return(hFile!=BAD_HANDLE);};
 | 
					    virtual bool IsOpened() {return hFile!=FILE_BAD_HANDLE;} // 'virtual' for MultiFile class.
 | 
				
			||||||
    int64 FileLength();
 | 
					    int64 FileLength();
 | 
				
			||||||
    void SetHandleType(FILE_HANDLETYPE Type);
 | 
					    void SetHandleType(FILE_HANDLETYPE Type) {HandleType=Type;}
 | 
				
			||||||
    FILE_HANDLETYPE GetHandleType() {return(HandleType);};
 | 
					    FILE_HANDLETYPE GetHandleType() {return HandleType;}
 | 
				
			||||||
    bool IsDevice();
 | 
					    bool IsDevice();
 | 
				
			||||||
    void fprintf(const char *fmt,...);
 | 
					 | 
				
			||||||
    static bool RemoveCreated();
 | 
					    static bool RemoveCreated();
 | 
				
			||||||
    FileHandle GetHandle() {return(hFile);};
 | 
					    FileHandle GetHandle() {return hFile;}
 | 
				
			||||||
    void SetIgnoreReadErrors(bool Mode) {IgnoreReadErrors=Mode;};
 | 
					    void SetHandle(FileHandle Handle) {Close();hFile=Handle;}
 | 
				
			||||||
    char *GetName() {return(FileName);}
 | 
					    void SetIgnoreReadErrors(bool Mode) {IgnoreReadErrors=Mode;}
 | 
				
			||||||
    int64 Copy(File &Dest,int64 Length=INT64NDF);
 | 
					    int64 Copy(File &Dest,int64 Length=INT64NDF);
 | 
				
			||||||
    void SetAllowDelete(bool Allow) {AllowDelete=Allow;}
 | 
					    void SetAllowDelete(bool Allow) {AllowDelete=Allow;}
 | 
				
			||||||
    void SetExceptions(bool Allow) {AllowExceptions=Allow;}
 | 
					    void SetExceptions(bool Allow) {AllowExceptions=Allow;}
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    void RemoveSequentialFlag() {NoSequentialRead=true;}
 | 
					    void RemoveSequentialFlag() {NoSequentialRead=true;}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					    void SetPreserveAtime(bool Preserve) {PreserveAtime=Preserve;}
 | 
				
			||||||
 | 
					#ifdef _UNIX
 | 
				
			||||||
 | 
					    int GetFD()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					#ifdef FILE_USE_OPEN
 | 
				
			||||||
 | 
					      return hFile;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					      return fileno(hFile);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    static size_t CopyBufferSize()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					      // USB flash performance is poor with 64 KB buffer, 256+ KB resolved it.
 | 
				
			||||||
 | 
					      // For copying from HDD to same HDD the best performance was with 256 KB
 | 
				
			||||||
 | 
					      // buffer in XP and with 1 MB buffer in Win10.
 | 
				
			||||||
 | 
					      return WinNT()==WNT_WXP ? 0x40000:0x100000;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					      return 0x100000;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,147 +1,126 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MKDIR_CODE MakeDir(const char *Name,const wchar *NameW,bool SetAttr,uint Attr)
 | 
					MKDIR_CODE MakeDir(const wchar *Name,bool SetAttr,uint Attr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  int Success;
 | 
					  // Windows automatically removes dots and spaces in the end of directory
 | 
				
			||||||
  if (WinNT() && NameW!=NULL && *NameW!=0)
 | 
					  // name. So we detect such names and process them with \\?\ prefix.
 | 
				
			||||||
    Success=CreateDirectoryW(NameW,NULL);
 | 
					  wchar *LastChar=PointToLastChar(Name);
 | 
				
			||||||
  else
 | 
					  bool Special=*LastChar=='.' || *LastChar==' ';
 | 
				
			||||||
    Success=CreateDirectory(Name,NULL);
 | 
					  BOOL RetCode=Special ? FALSE : CreateDirectory(Name,NULL);
 | 
				
			||||||
  if (Success)
 | 
					  if (RetCode==0 && !FileExist(Name))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wchar LongName[NM];
 | 
				
			||||||
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
 | 
					      RetCode=CreateDirectory(LongName,NULL);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (RetCode!=0) // Non-zero return code means success for CreateDirectory.
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (SetAttr)
 | 
					    if (SetAttr)
 | 
				
			||||||
      SetFileAttr(Name,NameW,Attr);
 | 
					      SetFileAttr(Name,Attr);
 | 
				
			||||||
    return(MKDIR_SUCCESS);
 | 
					    return MKDIR_SUCCESS;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  int ErrCode=GetLastError();
 | 
					  int ErrCode=GetLastError();
 | 
				
			||||||
  if (ErrCode==ERROR_FILE_NOT_FOUND || ErrCode==ERROR_PATH_NOT_FOUND)
 | 
					  if (ErrCode==ERROR_FILE_NOT_FOUND || ErrCode==ERROR_PATH_NOT_FOUND)
 | 
				
			||||||
    return(MKDIR_BADPATH);
 | 
					    return MKDIR_BADPATH;
 | 
				
			||||||
  return(MKDIR_ERROR);
 | 
					  return MKDIR_ERROR;
 | 
				
			||||||
#endif
 | 
					#elif defined(_UNIX)
 | 
				
			||||||
#ifdef _EMX
 | 
					  char NameA[NM];
 | 
				
			||||||
#ifdef _DJGPP
 | 
					  WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
  if (mkdir(Name,(Attr & FA_RDONLY) ? 0:S_IWUSR)==0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  if (__mkdir(Name)==0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (SetAttr)
 | 
					 | 
				
			||||||
      SetFileAttr(Name,NameW,Attr);
 | 
					 | 
				
			||||||
    return(MKDIR_SUCCESS);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return(errno==ENOENT ? MKDIR_BADPATH:MKDIR_ERROR);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef _UNIX
 | 
					 | 
				
			||||||
  mode_t uattr=SetAttr ? (mode_t)Attr:0777;
 | 
					  mode_t uattr=SetAttr ? (mode_t)Attr:0777;
 | 
				
			||||||
  int ErrCode=Name==NULL ? -1:mkdir(Name,uattr);
 | 
					  int ErrCode=mkdir(NameA,uattr);
 | 
				
			||||||
  if (ErrCode==-1)
 | 
					  if (ErrCode==-1)
 | 
				
			||||||
    return(errno==ENOENT ? MKDIR_BADPATH:MKDIR_ERROR);
 | 
					    return errno==ENOENT ? MKDIR_BADPATH:MKDIR_ERROR;
 | 
				
			||||||
  return(MKDIR_SUCCESS);
 | 
					  return MKDIR_SUCCESS;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  return MKDIR_ERROR;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool CreatePath(const char *Path,const wchar *PathW,bool SkipLastName)
 | 
					bool CreatePath(const wchar *Path,bool SkipLastName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_WIN_32) || defined(_EMX)
 | 
					  if (Path==NULL || *Path==0)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) || defined(_EMX)
 | 
				
			||||||
  uint DirAttr=0;
 | 
					  uint DirAttr=0;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  uint DirAttr=0777;
 | 
					  uint DirAttr=0777;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef UNICODE_SUPPORTED
 | 
					  
 | 
				
			||||||
  bool Wide=PathW!=NULL && *PathW!=0 && UnicodeEnabled();
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  bool Wide=false;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  bool IgnoreAscii=false;
 | 
					 | 
				
			||||||
  bool Success=true;
 | 
					  bool Success=true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const char *s=Path;
 | 
					  for (const wchar *s=Path;*s!=0;s++)
 | 
				
			||||||
  for (int PosW=0;;PosW++)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (s==NULL || s-Path>=NM || *s==0)
 | 
					    wchar DirName[NM];
 | 
				
			||||||
      IgnoreAscii=true;
 | 
					    if (s-Path>=ASIZE(DirName))
 | 
				
			||||||
    if (Wide && (PosW>=NM || PathW[PosW]==0) || !Wide && IgnoreAscii)
 | 
					 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    if (Wide && PathW[PosW]==CPATHDIVIDER || !Wide && *s==CPATHDIVIDER)
 | 
					
 | 
				
			||||||
 | 
					    // Process all kinds of path separators, so user can enter Unix style
 | 
				
			||||||
 | 
					    // path in Windows or Windows in Unix. s>Path check avoids attempting
 | 
				
			||||||
 | 
					    // creating an empty directory for paths starting from path separator.
 | 
				
			||||||
 | 
					    if (IsPathDiv(*s) && s>Path)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      wchar *DirPtrW=NULL,DirNameW[NM];
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
      if (Wide)
 | 
					      // We must not attempt to create "D:" directory, because first
 | 
				
			||||||
      {
 | 
					      // CreateDirectory will fail, so we'll use \\?\D:, which forces Wine
 | 
				
			||||||
        strncpyw(DirNameW,PathW,PosW);
 | 
					      // to create "D:" directory.
 | 
				
			||||||
        DirNameW[PosW]=0;
 | 
					      if (s==Path+2 && Path[1]==':')
 | 
				
			||||||
        DirPtrW=DirNameW;
 | 
					        continue;
 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      char DirName[NM];
 | 
					 | 
				
			||||||
      if (IgnoreAscii)
 | 
					 | 
				
			||||||
        WideToChar(DirPtrW,DirName);
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
#ifndef DBCS_SUPPORTED
 | 
					 | 
				
			||||||
        if (*s!=CPATHDIVIDER)
 | 
					 | 
				
			||||||
          for (const char *n=s;*n!=0 && n-Path<NM;n++)
 | 
					 | 
				
			||||||
            if (*n==CPATHDIVIDER)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              s=n;
 | 
					 | 
				
			||||||
              break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        strncpy(DirName,Path,s-Path);
 | 
					      wcsncpy(DirName,Path,s-Path);
 | 
				
			||||||
        DirName[s-Path]=0;
 | 
					      DirName[s-Path]=0;
 | 
				
			||||||
      }
 | 
					
 | 
				
			||||||
      if (MakeDir(DirName,DirPtrW,true,DirAttr)==MKDIR_SUCCESS)
 | 
					      Success=MakeDir(DirName,true,DirAttr)==MKDIR_SUCCESS;
 | 
				
			||||||
 | 
					      if (Success)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
#ifndef GUI
 | 
					 | 
				
			||||||
        mprintf(St(MCreatDir),DirName);
 | 
					        mprintf(St(MCreatDir),DirName);
 | 
				
			||||||
        mprintf(" %s",St(MOk));
 | 
					        mprintf(L" %s",St(MOk));
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        Success=false;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!IgnoreAscii)
 | 
					 | 
				
			||||||
      s=charnext(s);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (!SkipLastName && !IsPathDiv(*PointToLastChar(Path)))
 | 
					  if (!SkipLastName && !IsPathDiv(*PointToLastChar(Path)))
 | 
				
			||||||
    if (MakeDir(Path,PathW,true,DirAttr)!=MKDIR_SUCCESS)
 | 
					    Success=MakeDir(Path,true,DirAttr)==MKDIR_SUCCESS;
 | 
				
			||||||
      Success=false;
 | 
					  return Success;
 | 
				
			||||||
  return(Success);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SetDirTime(const char *Name,const wchar *NameW,RarTime *ftm,RarTime *ftc,RarTime *fta)
 | 
					void SetDirTime(const wchar *Name,RarTime *ftm,RarTime *ftc,RarTime *fta)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
  if (!WinNT())
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool sm=ftm!=NULL && ftm->IsSet();
 | 
					  bool sm=ftm!=NULL && ftm->IsSet();
 | 
				
			||||||
  bool sc=ftc!=NULL && ftc->IsSet();
 | 
					  bool sc=ftc!=NULL && ftc->IsSet();
 | 
				
			||||||
  bool sa=fta!=NULL && fta->IsSet();
 | 
					  bool sa=fta!=NULL && fta->IsSet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  unsigned int DirAttr=GetFileAttr(Name,NameW);
 | 
					  uint DirAttr=GetFileAttr(Name);
 | 
				
			||||||
  bool ResetAttr=(DirAttr!=0xffffffff && (DirAttr & FA_RDONLY)!=0);
 | 
					  bool ResetAttr=(DirAttr!=0xffffffff && (DirAttr & FILE_ATTRIBUTE_READONLY)!=0);
 | 
				
			||||||
  if (ResetAttr)
 | 
					  if (ResetAttr)
 | 
				
			||||||
    SetFileAttr(Name,NameW,0);
 | 
					    SetFileAttr(Name,0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  wchar DirNameW[NM];
 | 
					  HANDLE hFile=CreateFile(Name,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
				
			||||||
  GetWideName(Name,NameW,DirNameW);
 | 
					 | 
				
			||||||
  HANDLE hFile=CreateFileW(DirNameW,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
					 | 
				
			||||||
                          NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
 | 
					                          NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
 | 
				
			||||||
 | 
					  if (hFile==INVALID_HANDLE_VALUE)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wchar LongName[NM];
 | 
				
			||||||
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
 | 
					      hFile=CreateFile(LongName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
				
			||||||
 | 
					                       NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (hFile==INVALID_HANDLE_VALUE)
 | 
					  if (hFile==INVALID_HANDLE_VALUE)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  FILETIME fm,fc,fa;
 | 
					  FILETIME fm,fc,fa;
 | 
				
			||||||
  if (sm)
 | 
					  if (sm)
 | 
				
			||||||
    ftm->GetWin32(&fm);
 | 
					    ftm->GetWinFT(&fm);
 | 
				
			||||||
  if (sc)
 | 
					  if (sc)
 | 
				
			||||||
    ftc->GetWin32(&fc);
 | 
					    ftc->GetWinFT(&fc);
 | 
				
			||||||
  if (sa)
 | 
					  if (sa)
 | 
				
			||||||
    fta->GetWin32(&fa);
 | 
					    fta->GetWinFT(&fa);
 | 
				
			||||||
  SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL);
 | 
					  SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL);
 | 
				
			||||||
  CloseHandle(hFile);
 | 
					  CloseHandle(hFile);
 | 
				
			||||||
  if (ResetAttr)
 | 
					  if (ResetAttr)
 | 
				
			||||||
    SetFileAttr(Name,NameW,DirAttr);
 | 
					    SetFileAttr(Name,DirAttr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined(_UNIX) || defined(_EMX)
 | 
					#if defined(_UNIX) || defined(_EMX)
 | 
				
			||||||
  File::SetCloseFileTimeByName(Name,ftm,fta);
 | 
					  File::SetCloseFileTimeByName(Name,ftm,fta);
 | 
				
			||||||
| 
						 | 
					@ -149,146 +128,100 @@ void SetDirTime(const char *Name,const wchar *NameW,RarTime *ftm,RarTime *ftc,Ra
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool IsRemovable(const char *Name)
 | 
					bool IsRemovable(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
  char Root[NM];
 | 
					  wchar Root[NM];
 | 
				
			||||||
  GetPathRoot(Name,Root);
 | 
					  GetPathRoot(Name,Root,ASIZE(Root));
 | 
				
			||||||
  int Type=GetDriveType(*Root ? Root:NULL);
 | 
					  int Type=GetDriveType(*Root!=0 ? Root:NULL);
 | 
				
			||||||
  return(Type==DRIVE_REMOVABLE || Type==DRIVE_CDROM);
 | 
					  return Type==DRIVE_REMOVABLE || Type==DRIVE_CDROM;
 | 
				
			||||||
#elif defined(_EMX)
 | 
					 | 
				
			||||||
  char Drive=etoupper(Name[0]);
 | 
					 | 
				
			||||||
  return((Drive=='A' || Drive=='B') && Name[1]==':');
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return(false);
 | 
					  return false;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
int64 GetFreeDisk(const char *Name)
 | 
					int64 GetFreeDisk(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  char Root[NM];
 | 
					  wchar Root[NM];
 | 
				
			||||||
  GetPathRoot(Name,Root);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  typedef BOOL (WINAPI *GETDISKFREESPACEEX)(
 | 
					 | 
				
			||||||
    LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER
 | 
					 | 
				
			||||||
   );
 | 
					 | 
				
			||||||
  static GETDISKFREESPACEEX pGetDiskFreeSpaceEx=NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (pGetDiskFreeSpaceEx==NULL)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    HMODULE hKernel=GetModuleHandle("kernel32.dll");
 | 
					 | 
				
			||||||
    if (hKernel!=NULL)
 | 
					 | 
				
			||||||
      pGetDiskFreeSpaceEx=(GETDISKFREESPACEEX)GetProcAddress(hKernel,"GetDiskFreeSpaceExA");
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  if (pGetDiskFreeSpaceEx!=NULL)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    GetFilePath(Name,Root,ASIZE(Root));
 | 
					 | 
				
			||||||
    ULARGE_INTEGER uiTotalSize,uiTotalFree,uiUserFree;
 | 
					 | 
				
			||||||
    uiUserFree.u.LowPart=uiUserFree.u.HighPart=0;
 | 
					 | 
				
			||||||
    if (pGetDiskFreeSpaceEx(*Root ? Root:NULL,&uiUserFree,&uiTotalSize,&uiTotalFree) &&
 | 
					 | 
				
			||||||
        uiUserFree.u.HighPart<=uiTotalFree.u.HighPart)
 | 
					 | 
				
			||||||
      return(INT32TO64(uiUserFree.u.HighPart,uiUserFree.u.LowPart));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // We are here if we failed to load GetDiskFreeSpaceExA.
 | 
					 | 
				
			||||||
  DWORD SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters;
 | 
					 | 
				
			||||||
  if (!GetDiskFreeSpace(*Root ? Root:NULL,&SectorsPerCluster,&BytesPerSector,&FreeClusters,&TotalClusters))
 | 
					 | 
				
			||||||
    return(1457664);
 | 
					 | 
				
			||||||
  int64 FreeSize=SectorsPerCluster*BytesPerSector;
 | 
					 | 
				
			||||||
  FreeSize=FreeSize*FreeClusters;
 | 
					 | 
				
			||||||
  return(FreeSize);
 | 
					 | 
				
			||||||
#elif defined(_BEOS)
 | 
					 | 
				
			||||||
  char Root[NM];
 | 
					 | 
				
			||||||
  GetFilePath(Name,Root,ASIZE(Root));
 | 
					  GetFilePath(Name,Root,ASIZE(Root));
 | 
				
			||||||
  dev_t Dev=dev_for_path(*Root ? Root:".");
 | 
					
 | 
				
			||||||
  if (Dev<0)
 | 
					  ULARGE_INTEGER uiTotalSize,uiTotalFree,uiUserFree;
 | 
				
			||||||
    return(1457664);
 | 
					  uiUserFree.u.LowPart=uiUserFree.u.HighPart=0;
 | 
				
			||||||
  fs_info Info;
 | 
					  if (GetDiskFreeSpaceEx(*Root!=0 ? Root:NULL,&uiUserFree,&uiTotalSize,&uiTotalFree) &&
 | 
				
			||||||
  if (fs_stat_dev(Dev,&Info)!=0)
 | 
					      uiUserFree.u.HighPart<=uiTotalFree.u.HighPart)
 | 
				
			||||||
    return(1457664);
 | 
					    return INT32TO64(uiUserFree.u.HighPart,uiUserFree.u.LowPart);
 | 
				
			||||||
  int64 FreeSize=Info.block_size;
 | 
					  return 0;
 | 
				
			||||||
  FreeSize=FreeSize*Info.free_blocks;
 | 
					 | 
				
			||||||
  return(FreeSize);
 | 
					 | 
				
			||||||
#elif defined(_UNIX)
 | 
					#elif defined(_UNIX)
 | 
				
			||||||
  return(1457664);
 | 
					  wchar Root[NM];
 | 
				
			||||||
#elif defined(_EMX)
 | 
					  GetFilePath(Name,Root,ASIZE(Root));
 | 
				
			||||||
  int Drive=IsDiskLetter(Name) ? etoupper(Name[0])-'A'+1:0;
 | 
					  char RootA[NM];
 | 
				
			||||||
#ifndef _DJGPP
 | 
					  WideToChar(Root,RootA,ASIZE(RootA));
 | 
				
			||||||
  if (_osmode == OS2_MODE)
 | 
					  struct statvfs sfs;
 | 
				
			||||||
  {
 | 
					  if (statvfs(*RootA!=0 ? RootA:".",&sfs)!=0)
 | 
				
			||||||
    FSALLOCATE fsa;
 | 
					    return 0;
 | 
				
			||||||
    if (DosQueryFSInfo(Drive,1,&fsa,sizeof(fsa))!=0)
 | 
					  int64 FreeSize=sfs.f_bsize;
 | 
				
			||||||
      return(1457664);
 | 
					  FreeSize=FreeSize*sfs.f_bavail;
 | 
				
			||||||
    int64 FreeSize=fsa.cSectorUnit*fsa.cbSector;
 | 
					  return FreeSize;
 | 
				
			||||||
    FreeSize=FreeSize*fsa.cUnitAvail;
 | 
					 | 
				
			||||||
    return(FreeSize);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    union REGS regs,outregs;
 | 
					 | 
				
			||||||
    memset(®s,0,sizeof(regs));
 | 
					 | 
				
			||||||
    regs.h.ah=0x36;
 | 
					 | 
				
			||||||
    regs.h.dl=Drive;
 | 
					 | 
				
			||||||
#ifdef _DJGPP
 | 
					 | 
				
			||||||
    int86 (0x21,®s,&outregs);
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    _int86 (0x21,®s,&outregs);
 | 
					  return 0;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    if (outregs.x.ax==0xffff)
 | 
					 | 
				
			||||||
      return(1457664);
 | 
					 | 
				
			||||||
    int64 FreeSize=outregs.x.ax*outregs.x.cx;
 | 
					 | 
				
			||||||
    FreeSize=FreeSize*outregs.x.bx;
 | 
					 | 
				
			||||||
    return(FreeSize);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  #define DISABLEAUTODETECT
 | 
					 | 
				
			||||||
  return(1457664);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool FileExist(const char *Name,const wchar *NameW)
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(SILENT)
 | 
				
			||||||
 | 
					// Return 'true' for FAT and FAT32, so we can adjust the maximum supported
 | 
				
			||||||
 | 
					// file size to 4 GB for these file systems.
 | 
				
			||||||
 | 
					bool IsFAT(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  wchar Root[NM];
 | 
				
			||||||
    if (WinNT() && NameW!=NULL && *NameW!=0)
 | 
					  GetPathRoot(Name,Root,ASIZE(Root));
 | 
				
			||||||
      return(GetFileAttributesW(NameW)!=0xffffffff);
 | 
					  wchar FileSystem[MAX_PATH+1];
 | 
				
			||||||
    else
 | 
					  if (GetVolumeInformation(Root,NULL,0,NULL,NULL,NULL,FileSystem,ASIZE(FileSystem)))
 | 
				
			||||||
      return(GetFileAttributes(Name)!=0xffffffff);
 | 
					    return wcscmp(FileSystem,L"FAT")==0 || wcscmp(FileSystem,L"FAT32")==0;
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool FileExist(const wchar *Name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  return GetFileAttr(Name)!=0xffffffff;
 | 
				
			||||||
#elif defined(ENABLE_ACCESS)
 | 
					#elif defined(ENABLE_ACCESS)
 | 
				
			||||||
  return(access(Name,0)==0);
 | 
					  char NameA[NM];
 | 
				
			||||||
 | 
					  WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
 | 
					  return access(NameA,0)==0;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  struct FindData FD;
 | 
					  FindData FD;
 | 
				
			||||||
  return(FindFile::FastFind(Name,NameW,&FD));
 | 
					  return FindFile::FastFind(Name,&FD);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool WildFileExist(const char *Name,const wchar *NameW)
 | 
					bool WildFileExist(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (IsWildcard(Name,NameW))
 | 
					  if (IsWildcard(Name))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    FindFile Find;
 | 
					    FindFile Find;
 | 
				
			||||||
    Find.SetMask(Name);
 | 
					    Find.SetMask(Name);
 | 
				
			||||||
    Find.SetMaskW(NameW);
 | 
					    FindData fd;
 | 
				
			||||||
    struct FindData fd;
 | 
					    return Find.Next(&fd);
 | 
				
			||||||
    return(Find.Next(&fd));
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(FileExist(Name,NameW));
 | 
					  return FileExist(Name);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool IsDir(uint Attr)
 | 
					bool IsDir(uint Attr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined (_WIN_32) || defined(_EMX)
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  return(Attr!=0xffffffff && (Attr & 0x10)!=0);
 | 
					  return Attr!=0xffffffff && (Attr & FILE_ATTRIBUTE_DIRECTORY)!=0;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined(_UNIX)
 | 
					#if defined(_UNIX)
 | 
				
			||||||
  return((Attr & 0xF000)==0x4000);
 | 
					  return (Attr & 0xF000)==0x4000;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -296,28 +229,20 @@ bool IsDir(uint Attr)
 | 
				
			||||||
bool IsUnreadable(uint Attr)
 | 
					bool IsUnreadable(uint Attr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_UNIX) && defined(S_ISFIFO) && defined(S_ISSOCK) && defined(S_ISCHR)
 | 
					#if defined(_UNIX) && defined(S_ISFIFO) && defined(S_ISSOCK) && defined(S_ISCHR)
 | 
				
			||||||
  return(S_ISFIFO(Attr) || S_ISSOCK(Attr) || S_ISCHR(Attr));
 | 
					  return S_ISFIFO(Attr) || S_ISSOCK(Attr) || S_ISCHR(Attr);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  return(false);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool IsLabel(uint Attr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#if defined (_WIN_32) || defined(_EMX)
 | 
					 | 
				
			||||||
  return((Attr & 8)!=0);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  return(false);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool IsLink(uint Attr)
 | 
					bool IsLink(uint Attr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
  return((Attr & 0xF000)==0xA000);
 | 
					  return (Attr & 0xF000)==0xA000;
 | 
				
			||||||
 | 
					#elif defined(_WIN_ALL)
 | 
				
			||||||
 | 
					  return (Attr & FILE_ATTRIBUTE_REPARSE_POINT)!=0;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return(false);
 | 
					  return false;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -328,180 +253,134 @@ bool IsLink(uint Attr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool IsDeleteAllowed(uint FileAttr)
 | 
					bool IsDeleteAllowed(uint FileAttr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_WIN_32) || defined(_EMX)
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  return((FileAttr & (FA_RDONLY|FA_SYSTEM|FA_HIDDEN))==0);
 | 
					  return (FileAttr & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN))==0;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return((FileAttr & (S_IRUSR|S_IWUSR))==(S_IRUSR|S_IWUSR));
 | 
					  return (FileAttr & (S_IRUSR|S_IWUSR))==(S_IRUSR|S_IWUSR);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void PrepareToDelete(const char *Name,const wchar *NameW)
 | 
					void PrepareToDelete(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_WIN_32) || defined(_EMX)
 | 
					#if defined(_WIN_ALL) || defined(_EMX)
 | 
				
			||||||
  SetFileAttr(Name,NameW,0);
 | 
					  SetFileAttr(Name,0);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
  chmod(Name,S_IRUSR|S_IWUSR|S_IXUSR);
 | 
					  if (Name!=NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char NameA[NM];
 | 
				
			||||||
 | 
					    WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
 | 
					    chmod(NameA,S_IRUSR|S_IWUSR|S_IXUSR);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint GetFileAttr(const char *Name,const wchar *NameW)
 | 
					uint GetFileAttr(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    if (WinNT() && NameW!=NULL && *NameW!=0)
 | 
					  DWORD Attr=GetFileAttributes(Name);
 | 
				
			||||||
      return(GetFileAttributesW(NameW));
 | 
					  if (Attr==0xffffffff)
 | 
				
			||||||
    else
 | 
					  {
 | 
				
			||||||
      return(GetFileAttributes(Name));
 | 
					    wchar LongName[NM];
 | 
				
			||||||
#elif defined(_DJGPP)
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
  return(_chmod(Name,0));
 | 
					      Attr=GetFileAttributes(LongName);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return Attr;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					  char NameA[NM];
 | 
				
			||||||
 | 
					  WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
  struct stat st;
 | 
					  struct stat st;
 | 
				
			||||||
  if (stat(Name,&st)!=0)
 | 
					  if (stat(NameA,&st)!=0)
 | 
				
			||||||
    return(0);
 | 
					    return 0;
 | 
				
			||||||
#ifdef _EMX
 | 
					  return st.st_mode;
 | 
				
			||||||
  return(st.st_attr);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  return(st.st_mode);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool SetFileAttr(const char *Name,const wchar *NameW,uint Attr)
 | 
					bool SetFileAttr(const wchar *Name,uint Attr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  bool Success;
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  bool Success=SetFileAttributes(Name,Attr)!=0;
 | 
				
			||||||
    if (WinNT() && NameW!=NULL && *NameW!=0)
 | 
					  if (!Success)
 | 
				
			||||||
      Success=SetFileAttributesW(NameW,Attr)!=0;
 | 
					  {
 | 
				
			||||||
    else
 | 
					    wchar LongName[NM];
 | 
				
			||||||
      Success=SetFileAttributes(Name,Attr)!=0;
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
#elif defined(_DJGPP)
 | 
					      Success=SetFileAttributes(LongName,Attr)!=0;
 | 
				
			||||||
  Success=_chmod(Name,1,Attr)!=-1;
 | 
					  }
 | 
				
			||||||
#elif defined(_EMX)
 | 
					  return Success;
 | 
				
			||||||
  Success=__chmod(Name,1,Attr)!=-1;
 | 
					 | 
				
			||||||
#elif defined(_UNIX)
 | 
					#elif defined(_UNIX)
 | 
				
			||||||
  Success=chmod(Name,(mode_t)Attr)==0;
 | 
					  char NameA[NM];
 | 
				
			||||||
 | 
					  WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
 | 
					  return chmod(NameA,(mode_t)Attr)==0;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  Success=false;
 | 
					  return false;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  return(Success);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ConvertNameToFull(const char *Src,char *Dest)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
  char FullName[NM],*NamePtr;
 | 
					 | 
				
			||||||
  if (GetFullPathName(Src,sizeof(FullName),FullName,&NamePtr))
 | 
					 | 
				
			||||||
    strcpy(Dest,FullName);
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    if (Src!=Dest)
 | 
					 | 
				
			||||||
      strcpy(Dest,Src);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  char FullName[NM];
 | 
					 | 
				
			||||||
  if (IsPathDiv(*Src) || IsDiskLetter(Src))
 | 
					 | 
				
			||||||
    strcpy(FullName,Src);
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (getcwd(FullName,sizeof(FullName))==NULL)
 | 
					 | 
				
			||||||
      *FullName=0;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      AddEndSlash(FullName);
 | 
					 | 
				
			||||||
    strcat(FullName,Src);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  strcpy(Dest,FullName);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					#if 0
 | 
				
			||||||
void ConvertNameToFull(const wchar *Src,wchar *Dest)
 | 
					wchar *MkTemp(wchar *Name,size_t MaxSize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Src==NULL || *Src==0)
 | 
					  size_t Length=wcslen(Name);
 | 
				
			||||||
  {
 | 
					
 | 
				
			||||||
    *Dest=0;
 | 
					  RarTime CurTime;
 | 
				
			||||||
    return;
 | 
					  CurTime.SetCurrentTime();
 | 
				
			||||||
  }
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					  // We cannot use CurTime.GetWin() as is, because its lowest bits can
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					  // have low informational value, like being a zero or few fixed numbers.
 | 
				
			||||||
  if (WinNT())
 | 
					  uint Random=(uint)(CurTime.GetWin()/100000);
 | 
				
			||||||
#endif
 | 
					
 | 
				
			||||||
  {
 | 
					  // Using PID we guarantee that different RAR copies use different temp names
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					  // even if started in exactly the same time.
 | 
				
			||||||
    wchar FullName[NM],*NamePtr;
 | 
					  uint PID=0;
 | 
				
			||||||
    if (GetFullPathNameW(Src,sizeof(FullName)/sizeof(FullName[0]),FullName,&NamePtr))
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
      strcpyw(Dest,FullName);
 | 
					  PID=(uint)GetCurrentProcessId();
 | 
				
			||||||
    else
 | 
					#elif defined(_UNIX)
 | 
				
			||||||
#endif
 | 
					  PID=(uint)getpid();
 | 
				
			||||||
      if (Src!=Dest)
 | 
					 | 
				
			||||||
        strcpyw(Dest,Src);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    char AnsiName[NM];
 | 
					 | 
				
			||||||
    WideToChar(Src,AnsiName);
 | 
					 | 
				
			||||||
    ConvertNameToFull(AnsiName,AnsiName);
 | 
					 | 
				
			||||||
    CharToWide(AnsiName,Dest);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  char AnsiName[NM];
 | 
					 | 
				
			||||||
  WideToChar(Src,AnsiName);
 | 
					 | 
				
			||||||
  ConvertNameToFull(AnsiName,AnsiName);
 | 
					 | 
				
			||||||
  CharToWide(AnsiName,Dest);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (uint Attempt=0;;Attempt++)
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
char *MkTemp(char *Name)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  size_t Length=strlen(Name);
 | 
					 | 
				
			||||||
  if (Length<=6)
 | 
					 | 
				
			||||||
    return(NULL);
 | 
					 | 
				
			||||||
  int Random=clock();
 | 
					 | 
				
			||||||
  for (int Attempt=0;;Attempt++)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    sprintf(Name+Length-6,"%06u",Random+Attempt);
 | 
					    uint Ext=Random%50000+Attempt;
 | 
				
			||||||
    Name[Length-4]='.';
 | 
					    wchar RndText[50];
 | 
				
			||||||
 | 
					    swprintf(RndText,ASIZE(RndText),L"%u.%03u",PID,Ext);
 | 
				
			||||||
 | 
					    if (Length+wcslen(RndText)>=MaxSize || Attempt==1000)
 | 
				
			||||||
 | 
					      return NULL;
 | 
				
			||||||
 | 
					    wcsncpyz(Name+Length,RndText,MaxSize-Length);
 | 
				
			||||||
    if (!FileExist(Name))
 | 
					    if (!FileExist(Name))
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    if (Attempt==1000)
 | 
					 | 
				
			||||||
      return(NULL);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(Name);
 | 
					  return Name;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					void CalcFileSum(File *SrcFile,uint *CRC32,byte *Blake2,uint Threads,int64 Size,uint Flags)
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
uint CalcFileCRC(File *SrcFile,int64 Size,CALCCRC_SHOWMODE ShowMode)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SaveFilePos SavePos(*SrcFile);
 | 
					  int64 SavePos=SrcFile->Tell();
 | 
				
			||||||
  const size_t BufSize=0x10000;
 | 
					#ifndef SILENT
 | 
				
			||||||
  Array<byte> Data(BufSize);
 | 
					  int64 FileLength=Size==INT64NDF ? SrcFile->FileLength() : Size;
 | 
				
			||||||
  int64 BlockCount=0;
 | 
					 | 
				
			||||||
  uint DataCRC=0xffffffff;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(SILENT) && !defined(_WIN_CE)
 | 
					 | 
				
			||||||
  int64 FileLength=SrcFile->FileLength();
 | 
					 | 
				
			||||||
  if (ShowMode!=CALCCRC_SHOWNONE)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    mprintf(St(MCalcCRC));
 | 
					 | 
				
			||||||
    mprintf("     ");
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SrcFile->Seek(0,SEEK_SET);
 | 
					  if ((Flags & (CALCFSUM_SHOWTEXT|CALCFSUM_SHOWPERCENT))!=0)
 | 
				
			||||||
 | 
					    uiMsg(UIEVENT_FILESUMSTART);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((Flags & CALCFSUM_CURPOS)==0)
 | 
				
			||||||
 | 
					    SrcFile->Seek(0,SEEK_SET);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const size_t BufSize=0x100000;
 | 
				
			||||||
 | 
					  Array<byte> Data(BufSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DataHash HashCRC,HashBlake2;
 | 
				
			||||||
 | 
					  HashCRC.Init(HASH_CRC32,Threads);
 | 
				
			||||||
 | 
					  HashBlake2.Init(HASH_BLAKE2,Threads);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int64 BlockCount=0;
 | 
				
			||||||
 | 
					  int64 TotalRead=0;
 | 
				
			||||||
  while (true)
 | 
					  while (true)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    size_t SizeToRead;
 | 
					    size_t SizeToRead;
 | 
				
			||||||
| 
						 | 
					@ -512,67 +391,113 @@ uint CalcFileCRC(File *SrcFile,int64 Size,CALCCRC_SHOWMODE ShowMode)
 | 
				
			||||||
    int ReadSize=SrcFile->Read(&Data[0],SizeToRead);
 | 
					    int ReadSize=SrcFile->Read(&Data[0],SizeToRead);
 | 
				
			||||||
    if (ReadSize==0)
 | 
					    if (ReadSize==0)
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					    TotalRead+=ReadSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ++BlockCount;
 | 
					    if ((++BlockCount & 0xf)==0)
 | 
				
			||||||
    if ((BlockCount & 15)==0)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
#if !defined(SILENT) && !defined(_WIN_CE)
 | 
					#ifndef SILENT
 | 
				
			||||||
      if (ShowMode==CALCCRC_SHOWALL)
 | 
					      if ((Flags & CALCFSUM_SHOWPROGRESS)!=0)
 | 
				
			||||||
        mprintf("\b\b\b\b%3d%%",ToPercent(BlockCount*int64(BufSize),FileLength));
 | 
					        uiExtractProgress(TotalRead,FileLength,TotalRead,FileLength);
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        if ((Flags & CALCFSUM_SHOWPERCENT)!=0)
 | 
				
			||||||
 | 
					          uiMsg(UIEVENT_FILESUMPROGRESS,ToPercent(TotalRead,FileLength));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
      Wait();
 | 
					      Wait();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    DataCRC=CRC(DataCRC,&Data[0],ReadSize);
 | 
					
 | 
				
			||||||
 | 
					    if (CRC32!=NULL)
 | 
				
			||||||
 | 
					      HashCRC.Update(&Data[0],ReadSize);
 | 
				
			||||||
 | 
					    if (Blake2!=NULL)
 | 
				
			||||||
 | 
					      HashBlake2.Update(&Data[0],ReadSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (Size!=INT64NDF)
 | 
					    if (Size!=INT64NDF)
 | 
				
			||||||
      Size-=ReadSize;
 | 
					      Size-=ReadSize;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#if !defined(SILENT) && !defined(_WIN_CE)
 | 
					  SrcFile->Seek(SavePos,SEEK_SET);
 | 
				
			||||||
  if (ShowMode==CALCCRC_SHOWALL)
 | 
					
 | 
				
			||||||
    mprintf("\b\b\b\b    ");
 | 
					  if ((Flags & CALCFSUM_SHOWPERCENT)!=0)
 | 
				
			||||||
#endif
 | 
					    uiMsg(UIEVENT_FILESUMEND);
 | 
				
			||||||
  return(DataCRC^0xffffffff);
 | 
					
 | 
				
			||||||
 | 
					  if (CRC32!=NULL)
 | 
				
			||||||
 | 
					    *CRC32=HashCRC.GetCRC32();
 | 
				
			||||||
 | 
					  if (Blake2!=NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    HashValue Result;
 | 
				
			||||||
 | 
					    HashBlake2.Result(&Result);
 | 
				
			||||||
 | 
					    memcpy(Blake2,Result.Digest,sizeof(Result.Digest));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool RenameFile(const char *SrcName,const wchar *SrcNameW,const char *DestName,const wchar *DestNameW)
 | 
					bool RenameFile(const wchar *SrcName,const wchar *DestName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return(rename(SrcName,DestName)==0);
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  bool Success=MoveFile(SrcName,DestName)!=0;
 | 
				
			||||||
 | 
					  if (!Success)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wchar LongName1[NM],LongName2[NM];
 | 
				
			||||||
 | 
					    if (GetWinLongPath(SrcName,LongName1,ASIZE(LongName1)) &&
 | 
				
			||||||
 | 
					        GetWinLongPath(DestName,LongName2,ASIZE(LongName2)))
 | 
				
			||||||
 | 
					      Success=MoveFile(LongName1,LongName2)!=0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  char SrcNameA[NM],DestNameA[NM];
 | 
				
			||||||
 | 
					  WideToChar(SrcName,SrcNameA,ASIZE(SrcNameA));
 | 
				
			||||||
 | 
					  WideToChar(DestName,DestNameA,ASIZE(DestNameA));
 | 
				
			||||||
 | 
					  bool Success=rename(SrcNameA,DestNameA)==0;
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool DelFile(const char *Name)
 | 
					bool DelFile(const wchar *Name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return(DelFile(Name,NULL));
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
}
 | 
					  bool Success=DeleteFile(Name)!=0;
 | 
				
			||||||
 | 
					  if (!Success)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
bool DelFile(const char *Name,const wchar *NameW)
 | 
					    wchar LongName[NM];
 | 
				
			||||||
{
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
  return(remove(Name)==0);
 | 
					      Success=DeleteFile(LongName)!=0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  char NameA[NM];
 | 
				
			||||||
 | 
					  WideToChar(Name,NameA,ASIZE(NameA));
 | 
				
			||||||
 | 
					  bool Success=remove(NameA)==0;
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					bool SetFileCompression(const wchar *Name,bool State)
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE) && !defined(SFX_MODULE)
 | 
					 | 
				
			||||||
bool SetFileCompression(char *Name,wchar *NameW,bool State)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  wchar FileNameW[NM];
 | 
					  HANDLE hFile=CreateFile(Name,FILE_READ_DATA|FILE_WRITE_DATA,
 | 
				
			||||||
  GetWideName(Name,NameW,FileNameW);
 | 
					 | 
				
			||||||
  HANDLE hFile=CreateFileW(FileNameW,FILE_READ_DATA|FILE_WRITE_DATA,
 | 
					 | 
				
			||||||
                 FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
 | 
					                 FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
 | 
				
			||||||
                 FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
 | 
					                 FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
 | 
				
			||||||
  if (hFile==INVALID_HANDLE_VALUE)
 | 
					  if (hFile==INVALID_HANDLE_VALUE)
 | 
				
			||||||
    return(false);
 | 
					  {
 | 
				
			||||||
 | 
					    wchar LongName[NM];
 | 
				
			||||||
 | 
					    if (GetWinLongPath(Name,LongName,ASIZE(LongName)))
 | 
				
			||||||
 | 
					      hFile=CreateFile(LongName,FILE_READ_DATA|FILE_WRITE_DATA,
 | 
				
			||||||
 | 
					                 FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
 | 
				
			||||||
 | 
					                 FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (hFile==INVALID_HANDLE_VALUE)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
  SHORT NewState=State ? COMPRESSION_FORMAT_DEFAULT:COMPRESSION_FORMAT_NONE;
 | 
					  SHORT NewState=State ? COMPRESSION_FORMAT_DEFAULT:COMPRESSION_FORMAT_NONE;
 | 
				
			||||||
  DWORD Result;
 | 
					  DWORD Result;
 | 
				
			||||||
  int RetCode=DeviceIoControl(hFile,FSCTL_SET_COMPRESSION,&NewState,
 | 
					  int RetCode=DeviceIoControl(hFile,FSCTL_SET_COMPRESSION,&NewState,
 | 
				
			||||||
                              sizeof(NewState),NULL,0,&Result,NULL);
 | 
					                              sizeof(NewState),NULL,0,&Result,NULL);
 | 
				
			||||||
  CloseHandle(hFile);
 | 
					  CloseHandle(hFile);
 | 
				
			||||||
  return(RetCode!=0);
 | 
					  return RetCode!=0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -583,3 +508,5 @@ bool SetFileCompression(char *Name,wchar *NameW,bool State)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,42 +3,48 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum MKDIR_CODE {MKDIR_SUCCESS,MKDIR_ERROR,MKDIR_BADPATH};
 | 
					enum MKDIR_CODE {MKDIR_SUCCESS,MKDIR_ERROR,MKDIR_BADPATH};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MKDIR_CODE MakeDir(const char *Name,const wchar *NameW,bool SetAttr,uint Attr);
 | 
					MKDIR_CODE MakeDir(const wchar *Name,bool SetAttr,uint Attr);
 | 
				
			||||||
bool CreatePath(const char *Path,const wchar *PathW,bool SkipLastName);
 | 
					bool CreatePath(const wchar *Path,bool SkipLastName);
 | 
				
			||||||
void SetDirTime(const char *Name,const wchar *NameW,RarTime *ftm,RarTime *ftc,RarTime *fta);
 | 
					void SetDirTime(const wchar *Name,RarTime *ftm,RarTime *ftc,RarTime *fta);
 | 
				
			||||||
bool IsRemovable(const char *Name);
 | 
					bool IsRemovable(const wchar *Name);
 | 
				
			||||||
int64 GetFreeDisk(const char *Name);
 | 
					
 | 
				
			||||||
bool FileExist(const char *Name,const wchar *NameW=NULL);
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
bool WildFileExist(const char *Name,const wchar *NameW=NULL);
 | 
					int64 GetFreeDisk(const wchar *Name);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(SILENT)
 | 
				
			||||||
 | 
					bool IsFAT(const wchar *Root);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool FileExist(const wchar *Name);
 | 
				
			||||||
 | 
					bool WildFileExist(const wchar *Name);
 | 
				
			||||||
bool IsDir(uint Attr);
 | 
					bool IsDir(uint Attr);
 | 
				
			||||||
bool IsUnreadable(uint Attr);
 | 
					bool IsUnreadable(uint Attr);
 | 
				
			||||||
bool IsLabel(uint Attr);
 | 
					 | 
				
			||||||
bool IsLink(uint Attr);
 | 
					bool IsLink(uint Attr);
 | 
				
			||||||
void SetSFXMode(const char *FileName);
 | 
					void SetSFXMode(const wchar *FileName);
 | 
				
			||||||
void EraseDiskContents(const char *FileName);
 | 
					void EraseDiskContents(const wchar *FileName);
 | 
				
			||||||
bool IsDeleteAllowed(uint FileAttr);
 | 
					bool IsDeleteAllowed(uint FileAttr);
 | 
				
			||||||
void PrepareToDelete(const char *Name,const wchar *NameW=NULL);
 | 
					void PrepareToDelete(const wchar *Name);
 | 
				
			||||||
uint GetFileAttr(const char *Name,const wchar *NameW=NULL);
 | 
					uint GetFileAttr(const wchar *Name);
 | 
				
			||||||
bool SetFileAttr(const char *Name,const wchar *NameW,uint Attr);
 | 
					bool SetFileAttr(const wchar *Name,uint Attr);
 | 
				
			||||||
void ConvertNameToFull(const char *Src,char *Dest);
 | 
					#if 0
 | 
				
			||||||
void ConvertNameToFull(const wchar *Src,wchar *Dest);
 | 
					wchar* MkTemp(wchar *Name,size_t MaxSize);
 | 
				
			||||||
char* MkTemp(char *Name);
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum CALCFSUM_FLAGS {CALCFSUM_SHOWTEXT=1,CALCFSUM_SHOWPERCENT=2,CALCFSUM_SHOWPROGRESS=4,CALCFSUM_CURPOS=8};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum CALCCRC_SHOWMODE {CALCCRC_SHOWNONE,CALCCRC_SHOWTEXT,CALCCRC_SHOWALL};
 | 
					void CalcFileSum(File *SrcFile,uint *CRC32,byte *Blake2,uint Threads,int64 Size=INT64NDF,uint Flags=0);
 | 
				
			||||||
uint CalcFileCRC(File *SrcFile,int64 Size=INT64NDF,CALCCRC_SHOWMODE ShowMode=CALCCRC_SHOWNONE);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool RenameFile(const char *SrcName,const wchar *SrcNameW,const char *DestName,const wchar *DestNameW);
 | 
					bool RenameFile(const wchar *SrcName,const wchar *DestName);
 | 
				
			||||||
bool DelFile(const char *Name);
 | 
					bool DelFile(const wchar *Name);
 | 
				
			||||||
bool DelFile(const char *Name,const wchar *NameW);
 | 
					bool DelDir(const wchar *Name);
 | 
				
			||||||
bool DelDir(const char *Name);
 | 
					 | 
				
			||||||
bool DelDir(const char *Name,const wchar *NameW);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE)
 | 
				
			||||||
bool SetFileCompression(char *Name,wchar *NameW,bool State);
 | 
					bool SetFileCompression(const wchar *Name,bool State);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,189 +1,166 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool IsUnicode(byte *Data,int Size);
 | 
					bool ReadTextFile(
 | 
				
			||||||
 | 
					  const wchar *Name,
 | 
				
			||||||
bool ReadTextFile(const char *Name,StringList *List,bool Config,
 | 
					  StringList *List,
 | 
				
			||||||
                  bool AbortOnError,RAR_CHARSET SrcCharset,bool Unquote,
 | 
					  bool Config,
 | 
				
			||||||
                  bool SkipComments,bool ExpandEnvStr)
 | 
					  bool AbortOnError,
 | 
				
			||||||
 | 
					  RAR_CHARSET SrcCharset,
 | 
				
			||||||
 | 
					  bool Unquote,
 | 
				
			||||||
 | 
					  bool SkipComments,
 | 
				
			||||||
 | 
					  bool ExpandEnvStr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char FileName[NM];
 | 
					  wchar FileName[NM];
 | 
				
			||||||
  if (Config)
 | 
					  *FileName=0;
 | 
				
			||||||
    GetConfigName(Name,FileName,true);
 | 
					
 | 
				
			||||||
  else
 | 
					  if (Name!=NULL)
 | 
				
			||||||
    strcpy(FileName,Name);
 | 
					    if (Config)
 | 
				
			||||||
 | 
					      GetConfigName(Name,FileName,ASIZE(FileName),true,false);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      wcsncpyz(FileName,Name,ASIZE(FileName));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  File SrcFile;
 | 
					  File SrcFile;
 | 
				
			||||||
  if (*FileName)
 | 
					  if (*FileName!=0)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    bool OpenCode=AbortOnError ? SrcFile.WOpen(FileName):SrcFile.Open(FileName);
 | 
					    bool OpenCode=AbortOnError ? SrcFile.WOpen(FileName):SrcFile.Open(FileName,0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!OpenCode)
 | 
					    if (!OpenCode)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      if (AbortOnError)
 | 
					      if (AbortOnError)
 | 
				
			||||||
        ErrHandler.Exit(OPEN_ERROR);
 | 
					        ErrHandler.Exit(RARX_OPEN);
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    SrcFile.SetHandleType(FILE_HANDLESTD);
 | 
					    SrcFile.SetHandleType(FILE_HANDLESTD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  unsigned int DataSize=0,ReadSize;
 | 
					  uint DataSize=0,ReadSize;
 | 
				
			||||||
  const int ReadBlock=1024;
 | 
					  const int ReadBlock=4096;
 | 
				
			||||||
  Array<char> Data(ReadBlock+5);
 | 
					
 | 
				
			||||||
 | 
					  Array<byte> Data(ReadBlock);
 | 
				
			||||||
  while ((ReadSize=SrcFile.Read(&Data[DataSize],ReadBlock))!=0)
 | 
					  while ((ReadSize=SrcFile.Read(&Data[DataSize],ReadBlock))!=0)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    DataSize+=ReadSize;
 | 
					    DataSize+=ReadSize;
 | 
				
			||||||
    Data.Add(ReadSize);
 | 
					    Data.Add(ReadSize); // Always have ReadBlock available for next data.
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  // Set to really read size, so we can zero terminate it correctly.
 | 
				
			||||||
 | 
					  Data.Alloc(DataSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  memset(&Data[DataSize],0,5);
 | 
					  int LittleEndian=DataSize>=2 && Data[0]==255 && Data[1]==254 ? 1:0;
 | 
				
			||||||
 | 
					  int BigEndian=DataSize>=2 && Data[0]==254 && Data[1]==255 ? 1:0;
 | 
				
			||||||
 | 
					  bool Utf8=DataSize>=3 && Data[0]==0xef && Data[1]==0xbb && Data[2]==0xbf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (SrcCharset==RCH_UNICODE ||
 | 
					  if (SrcCharset==RCH_DEFAULT)
 | 
				
			||||||
      SrcCharset==RCH_DEFAULT && IsUnicode((byte *)&Data[0],DataSize))
 | 
					    SrcCharset=DetectTextEncoding(&Data[0],DataSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Array<wchar> DataW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (SrcCharset==RCH_DEFAULT || SrcCharset==RCH_OEM || SrcCharset==RCH_ANSI)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    // Unicode in native system format, can be more than 2 bytes per character.
 | 
					    Data.Push(0); // Zero terminate.
 | 
				
			||||||
    Array<wchar> DataW(Data.Size()/2+1);
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
    for (size_t I=2;I<Data.Size()-1;I+=2)
 | 
					    if (SrcCharset==RCH_OEM)
 | 
				
			||||||
    {
 | 
					      OemToCharA((char *)&Data[0],(char *)&Data[0]);
 | 
				
			||||||
      // Need to convert Data to (byte) first to prevent the sign extension
 | 
					 | 
				
			||||||
      // to higher bytes.
 | 
					 | 
				
			||||||
      DataW[(I-2)/2]=(wchar)((byte)Data[I])+(wchar)((byte)Data[I+1])*256;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    wchar *CurStr=&DataW[0];
 | 
					 | 
				
			||||||
    Array<char> AnsiName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (*CurStr!=0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      wchar *NextStr=CurStr,*CmtPtr=NULL;
 | 
					 | 
				
			||||||
      while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/')
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          *NextStr=0;
 | 
					 | 
				
			||||||
          CmtPtr=NextStr;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        NextStr++;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      *NextStr=0;
 | 
					 | 
				
			||||||
      for (wchar *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (*SpacePtr!=' ' && *SpacePtr!='\t')
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
        *SpacePtr=0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (*CurStr)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        // Length and AddSize must be defined as signed, because AddSize
 | 
					 | 
				
			||||||
        // can be negative.
 | 
					 | 
				
			||||||
        int Length=(int)strlenw(CurStr);
 | 
					 | 
				
			||||||
        int AddSize=4*(Length-(int)AnsiName.Size()+1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (AddSize>0)
 | 
					 | 
				
			||||||
          AnsiName.Add(AddSize);
 | 
					 | 
				
			||||||
        if (Unquote && *CurStr=='\"' && CurStr[Length-1]=='\"')
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          CurStr[Length-1]=0;
 | 
					 | 
				
			||||||
          CurStr++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        WideToChar(CurStr,&AnsiName[0],AnsiName.Size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        bool Expanded=false;
 | 
					 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					 | 
				
			||||||
        if (ExpandEnvStr && *CurStr=='%')
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          // expanding environment variables in Windows version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          char ExpName[NM];
 | 
					 | 
				
			||||||
          wchar ExpNameW[NM];
 | 
					 | 
				
			||||||
          *ExpNameW=0;
 | 
					 | 
				
			||||||
          int ret,retw=1;
 | 
					 | 
				
			||||||
          ret=ExpandEnvironmentStrings(&AnsiName[0],ExpName,ASIZE(ExpName));
 | 
					 | 
				
			||||||
          if (ret!=0 && WinNT())
 | 
					 | 
				
			||||||
            retw=ExpandEnvironmentStringsW(CurStr,ExpNameW,ASIZE(ExpNameW));
 | 
					 | 
				
			||||||
          Expanded=ret!=0 && ret<ASIZE(ExpName) &&
 | 
					 | 
				
			||||||
                   retw!=0 && retw<ASIZE(ExpNameW);
 | 
					 | 
				
			||||||
          if (Expanded)
 | 
					 | 
				
			||||||
            List->AddString(ExpName,ExpNameW);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        if (!Expanded)
 | 
					    DataW.Alloc(Data.Size());
 | 
				
			||||||
          List->AddString(&AnsiName[0],CurStr);
 | 
					    CharToWide((char *)&Data[0],&DataW[0],DataW.Size());
 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      CurStr=NextStr+1;
 | 
					 | 
				
			||||||
      while (*CurStr=='\r' || *CurStr=='\n')
 | 
					 | 
				
			||||||
        CurStr++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					
 | 
				
			||||||
 | 
					  if (SrcCharset==RCH_UNICODE)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    char *CurStr=&Data[0];
 | 
					    size_t Start=2; // Skip byte order mark.
 | 
				
			||||||
    while (*CurStr!=0)
 | 
					    if (!LittleEndian && !BigEndian) // No byte order mask.
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      char *NextStr=CurStr,*CmtPtr=NULL;
 | 
					      Start=0;
 | 
				
			||||||
      while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0)
 | 
					      LittleEndian=1;
 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/')
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          *NextStr=0;
 | 
					 | 
				
			||||||
          CmtPtr=NextStr;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        NextStr++;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      *NextStr=0;
 | 
					 | 
				
			||||||
      for (char *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (*SpacePtr!=' ' && *SpacePtr!='\t')
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
        *SpacePtr=0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (*CurStr)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if (Unquote && *CurStr=='\"')
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          size_t Length=strlen(CurStr);
 | 
					 | 
				
			||||||
          if (CurStr[Length-1]=='\"')
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            CurStr[Length-1]=0;
 | 
					 | 
				
			||||||
            CurStr++;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
#if defined(_WIN_32)
 | 
					 | 
				
			||||||
        if (SrcCharset==RCH_OEM)
 | 
					 | 
				
			||||||
          OemToChar(CurStr,CurStr);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        bool Expanded=false;
 | 
					 | 
				
			||||||
#if defined(_WIN_32) && !defined(_WIN_CE)
 | 
					 | 
				
			||||||
        if (ExpandEnvStr && *CurStr=='%')
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          // expanding environment variables in Windows version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          char ExpName[NM];
 | 
					 | 
				
			||||||
          int ret=ExpandEnvironmentStrings(CurStr,ExpName,ASIZE(ExpName));
 | 
					 | 
				
			||||||
          Expanded=ret!=0 && ret<ASIZE(ExpName);
 | 
					 | 
				
			||||||
          if (Expanded)
 | 
					 | 
				
			||||||
            List->AddString(ExpName);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        if (!Expanded)
 | 
					 | 
				
			||||||
          List->AddString(CurStr);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      CurStr=NextStr+1;
 | 
					 | 
				
			||||||
      while (*CurStr=='\r' || *CurStr=='\n')
 | 
					 | 
				
			||||||
        CurStr++;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    DataW.Alloc(Data.Size()/2+1);
 | 
				
			||||||
 | 
					    size_t End=Data.Size() & ~1; // We need even bytes number for UTF-16.
 | 
				
			||||||
 | 
					    for (size_t I=Start;I<End;I+=2)
 | 
				
			||||||
 | 
					      DataW[(I-Start)/2]=Data[I+BigEndian]+Data[I+LittleEndian]*256;
 | 
				
			||||||
 | 
					    DataW[(End-Start)/2]=0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(true);
 | 
					
 | 
				
			||||||
 | 
					  if (SrcCharset==RCH_UTF8)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Data.Push(0); // Zero terminate data.
 | 
				
			||||||
 | 
					    DataW.Alloc(Data.Size());
 | 
				
			||||||
 | 
					    UtfToWide((const char *)(Data+(Utf8 ? 3:0)),&DataW[0],DataW.Size());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wchar *CurStr=&DataW[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (*CurStr!=0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wchar *NextStr=CurStr,*CmtPtr=NULL;
 | 
				
			||||||
 | 
					    while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/')
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        *NextStr=0;
 | 
				
			||||||
 | 
					        CmtPtr=NextStr;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      NextStr++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    bool Done=*NextStr==0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    *NextStr=0;
 | 
				
			||||||
 | 
					    for (wchar *SpacePtr=(CmtPtr!=NULL ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (*SpacePtr!=' ' && *SpacePtr!='\t')
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      *SpacePtr=0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (Unquote && *CurStr=='\"')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      size_t Length=wcslen(CurStr);
 | 
				
			||||||
 | 
					      if (CurStr[Length-1]=='\"')
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        CurStr[Length-1]=0;
 | 
				
			||||||
 | 
					        CurStr++;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool Expanded=false;
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
 | 
					    if (ExpandEnvStr && *CurStr=='%') // Expand environment variables in Windows.
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wchar ExpName[NM];
 | 
				
			||||||
 | 
					      *ExpName=0;
 | 
				
			||||||
 | 
					      DWORD Result=ExpandEnvironmentStrings(CurStr,ExpName,ASIZE(ExpName));
 | 
				
			||||||
 | 
					      Expanded=Result!=0 && Result<ASIZE(ExpName);
 | 
				
			||||||
 | 
					      if (Expanded && *ExpName!=0)
 | 
				
			||||||
 | 
					        List->AddString(ExpName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    if (!Expanded && *CurStr!=0)
 | 
				
			||||||
 | 
					      List->AddString(CurStr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Done)
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    CurStr=NextStr+1;
 | 
				
			||||||
 | 
					    while (*CurStr=='\r' || *CurStr=='\n')
 | 
				
			||||||
 | 
					      CurStr++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool IsUnicode(byte *Data,int Size)
 | 
					RAR_CHARSET DetectTextEncoding(const byte *Data,size_t DataSize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Size<4 || Data[0]!=0xff || Data[1]!=0xfe)
 | 
					  if (DataSize>3 && Data[0]==0xef && Data[1]==0xbb && Data[2]==0xbf &&
 | 
				
			||||||
    return(false);
 | 
					      IsTextUtf8(Data+3,DataSize-3))
 | 
				
			||||||
  for (int I=2;I<Size;I++)
 | 
					    return RCH_UTF8;
 | 
				
			||||||
    if (Data[I]<32 && Data[I]!='\r' && Data[I]!='\n')
 | 
					
 | 
				
			||||||
      return(true);
 | 
					  bool LittleEndian=DataSize>2 && Data[0]==255 && Data[1]==254;
 | 
				
			||||||
  return(false);
 | 
					  bool BigEndian=DataSize>2 && Data[0]==254 && Data[1]==255;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (LittleEndian || BigEndian)  
 | 
				
			||||||
 | 
					    for (size_t I=LittleEndian ? 3 : 2;I<DataSize;I+=2)
 | 
				
			||||||
 | 
					      if (Data[I]<32 && Data[I]!='\r' && Data[I]!='\n')
 | 
				
			||||||
 | 
					        return RCH_UNICODE; // High byte in UTF-16 char is found.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return RCH_DEFAULT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,17 @@
 | 
				
			||||||
#ifndef _RAR_FILESTR_
 | 
					#ifndef _RAR_FILESTR_
 | 
				
			||||||
#define _RAR_FILESTR_
 | 
					#define _RAR_FILESTR_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool ReadTextFile(const char *Name,StringList *List,bool Config,
 | 
					bool ReadTextFile(
 | 
				
			||||||
                  bool AbortOnError=false,RAR_CHARSET SrcCharset=RCH_DEFAULT,
 | 
					  const wchar *Name,
 | 
				
			||||||
                  bool Unquote=false,bool SkipComments=false,
 | 
					  StringList *List,
 | 
				
			||||||
                  bool ExpandEnvStr=false);
 | 
					  bool Config,
 | 
				
			||||||
 | 
					  bool AbortOnError=false,
 | 
				
			||||||
 | 
					  RAR_CHARSET SrcCharset=RCH_DEFAULT,
 | 
				
			||||||
 | 
					  bool Unquote=false,
 | 
				
			||||||
 | 
					  bool SkipComments=false,
 | 
				
			||||||
 | 
					  bool ExpandEnvStr=false
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RAR_CHARSET DetectTextEncoding(const byte *Data,size_t DataSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,9 +3,8 @@
 | 
				
			||||||
FindFile::FindFile()
 | 
					FindFile::FindFile()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  *FindMask=0;
 | 
					  *FindMask=0;
 | 
				
			||||||
  *FindMaskW=0;
 | 
					 | 
				
			||||||
  FirstCall=true;
 | 
					  FirstCall=true;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  hFind=INVALID_HANDLE_VALUE;
 | 
					  hFind=INVALID_HANDLE_VALUE;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  dirp=NULL;
 | 
					  dirp=NULL;
 | 
				
			||||||
| 
						 | 
					@ -15,7 +14,7 @@ FindFile::FindFile()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FindFile::~FindFile()
 | 
					FindFile::~FindFile()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  if (hFind!=INVALID_HANDLE_VALUE)
 | 
					  if (hFind!=INVALID_HANDLE_VALUE)
 | 
				
			||||||
    FindClose(hFind);
 | 
					    FindClose(hFind);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					@ -25,275 +24,195 @@ FindFile::~FindFile()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void FindFile::SetMask(const char *FindMask)
 | 
					void FindFile::SetMask(const wchar *Mask)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  strcpy(FindFile::FindMask,FindMask);
 | 
					  wcsncpyz(FindMask,Mask,ASIZE(FindMask));
 | 
				
			||||||
  if (*FindMaskW==0)
 | 
					 | 
				
			||||||
    CharToWide(FindMask,FindMaskW);
 | 
					 | 
				
			||||||
  FirstCall=true;
 | 
					  FirstCall=true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void FindFile::SetMaskW(const wchar *FindMaskW)
 | 
					bool FindFile::Next(FindData *fd,bool GetSymLink)
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (FindMaskW==NULL)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  strcpyw(FindFile::FindMaskW,FindMaskW);
 | 
					 | 
				
			||||||
  if (*FindMask==0)
 | 
					 | 
				
			||||||
    WideToChar(FindMaskW,FindMask);
 | 
					 | 
				
			||||||
  FirstCall=true;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool FindFile::Next(struct FindData *fd,bool GetSymLink)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  fd->Error=false;
 | 
					  fd->Error=false;
 | 
				
			||||||
  if (*FindMask==0)
 | 
					  if (*FindMask==0)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  if (FirstCall)
 | 
					  if (FirstCall)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if ((hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,FindMaskW,fd))==INVALID_HANDLE_VALUE)
 | 
					    if ((hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,fd))==INVALID_HANDLE_VALUE)
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    if (Win32Find(hFind,FindMask,FindMaskW,fd)==INVALID_HANDLE_VALUE)
 | 
					    if (Win32Find(hFind,FindMask,fd)==INVALID_HANDLE_VALUE)
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  if (FirstCall)
 | 
					  if (FirstCall)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    char DirName[NM];
 | 
					    wchar DirName[NM];
 | 
				
			||||||
    strcpy(DirName,FindMask);
 | 
					    wcsncpyz(DirName,FindMask,ASIZE(DirName));
 | 
				
			||||||
    RemoveNameFromPath(DirName);
 | 
					    RemoveNameFromPath(DirName);
 | 
				
			||||||
    if (*DirName==0)
 | 
					    if (*DirName==0)
 | 
				
			||||||
      strcpy(DirName,".");
 | 
					      wcsncpyz(DirName,L".",ASIZE(DirName));
 | 
				
			||||||
/*
 | 
					    char DirNameA[NM];
 | 
				
			||||||
    else
 | 
					    WideToChar(DirName,DirNameA,ASIZE(DirNameA));
 | 
				
			||||||
    {
 | 
					    if ((dirp=opendir(DirNameA))==NULL)
 | 
				
			||||||
      int Length=strlen(DirName);
 | 
					 | 
				
			||||||
      if (Length>1 && DirName[Length-1]==CPATHDIVIDER && (Length!=3 || !IsDriveDiv(DirName[1])))
 | 
					 | 
				
			||||||
        DirName[Length-1]=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
    if ((dirp=opendir(DirName))==NULL)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      fd->Error=(errno!=ENOENT);
 | 
					      fd->Error=(errno!=ENOENT);
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  while (1)
 | 
					  while (1)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    wchar Name[NM];
 | 
				
			||||||
    struct dirent *ent=readdir(dirp);
 | 
					    struct dirent *ent=readdir(dirp);
 | 
				
			||||||
    if (ent==NULL)
 | 
					    if (ent==NULL)
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
    if (strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0)
 | 
					    if (strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0)
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    if (CmpName(FindMask,ent->d_name,MATCH_NAMES))
 | 
					    if (!CharToWide(ent->d_name,Name,ASIZE(Name)))
 | 
				
			||||||
 | 
					      uiMsg(UIERROR_INVALIDNAME,UINULL,Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (CmpName(FindMask,Name,MATCH_NAMES))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      char FullName[NM];
 | 
					      wchar FullName[NM];
 | 
				
			||||||
      strcpy(FullName,FindMask);
 | 
					      wcsncpyz(FullName,FindMask,ASIZE(FullName));
 | 
				
			||||||
      *PointToName(FullName)=0;
 | 
					      *PointToName(FullName)=0;
 | 
				
			||||||
      if (strlen(FullName)+strlen(ent->d_name)>=ASIZE(FullName)-1)
 | 
					      if (wcslen(FullName)+wcslen(Name)>=ASIZE(FullName)-1)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
#ifndef SILENT
 | 
					        uiMsg(UIERROR_PATHTOOLONG,FullName,L"",Name);
 | 
				
			||||||
        Log(NULL,"\n%s%s",FullName,ent->d_name);
 | 
					        return false;
 | 
				
			||||||
        Log(NULL,St(MPathTooLong));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        return(false);
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      strcat(FullName,ent->d_name);
 | 
					      wcsncatz(FullName,Name,ASIZE(FullName));
 | 
				
			||||||
      if (!FastFind(FullName,NULL,fd,GetSymLink))
 | 
					      if (!FastFind(FullName,fd,GetSymLink))
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        ErrHandler.OpenErrorMsg(FullName);
 | 
					        ErrHandler.OpenErrorMsg(FullName);
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      strcpy(fd->Name,FullName);
 | 
					      wcsncpyz(fd->Name,FullName,ASIZE(fd->Name));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  *fd->NameW=0;
 | 
					 | 
				
			||||||
#ifdef _APPLE
 | 
					 | 
				
			||||||
  if (!LowAscii(fd->Name))
 | 
					 | 
				
			||||||
    UtfToWide(fd->Name,fd->NameW,sizeof(fd->NameW));
 | 
					 | 
				
			||||||
#elif defined(UNICODE_SUPPORTED)
 | 
					 | 
				
			||||||
  if (!LowAscii(fd->Name) && UnicodeEnabled())
 | 
					 | 
				
			||||||
    CharToWide(fd->Name,fd->NameW);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  fd->Flags=0;
 | 
					  fd->Flags=0;
 | 
				
			||||||
  fd->IsDir=IsDir(fd->FileAttr);
 | 
					  fd->IsDir=IsDir(fd->FileAttr);
 | 
				
			||||||
 | 
					  fd->IsLink=IsLink(fd->FileAttr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FirstCall=false;
 | 
					  FirstCall=false;
 | 
				
			||||||
  char *Name=PointToName(fd->Name);
 | 
					  wchar *NameOnly=PointToName(fd->Name);
 | 
				
			||||||
  if (strcmp(Name,".")==0 || strcmp(Name,"..")==0)
 | 
					  if (wcscmp(NameOnly,L".")==0 || wcscmp(NameOnly,L"..")==0)
 | 
				
			||||||
    return(Next(fd));
 | 
					    return Next(fd);
 | 
				
			||||||
  return(true);
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool FindFile::FastFind(const char *FindMask,const wchar *FindMaskW,struct FindData *fd,bool GetSymLink)
 | 
					bool FindFile::FastFind(const wchar *FindMask,FindData *fd,bool GetSymLink)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  fd->Error=false;
 | 
					  fd->Error=false;
 | 
				
			||||||
#ifndef _UNIX
 | 
					#ifndef _UNIX
 | 
				
			||||||
  if (IsWildcard(FindMask,FindMaskW))
 | 
					  if (IsWildcard(FindMask))
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
#endif    
 | 
					#endif    
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  HANDLE hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,FindMaskW,fd);
 | 
					  HANDLE hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,fd);
 | 
				
			||||||
  if (hFind==INVALID_HANDLE_VALUE)
 | 
					  if (hFind==INVALID_HANDLE_VALUE)
 | 
				
			||||||
    return(false);
 | 
					    return false;
 | 
				
			||||||
  FindClose(hFind);
 | 
					  FindClose(hFind);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					  char FindMaskA[NM];
 | 
				
			||||||
 | 
					  WideToChar(FindMask,FindMaskA,ASIZE(FindMaskA));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  struct stat st;
 | 
					  struct stat st;
 | 
				
			||||||
  if (GetSymLink)
 | 
					  if (GetSymLink)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
#ifdef SAVE_LINKS
 | 
					#ifdef SAVE_LINKS
 | 
				
			||||||
    if (lstat(FindMask,&st)!=0)
 | 
					    if (lstat(FindMaskA,&st)!=0)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    if (stat(FindMask,&st)!=0)
 | 
					    if (stat(FindMaskA,&st)!=0)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      fd->Error=(errno!=ENOENT);
 | 
					      fd->Error=(errno!=ENOENT);
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    if (stat(FindMask,&st)!=0)
 | 
					    if (stat(FindMaskA,&st)!=0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      fd->Error=(errno!=ENOENT);
 | 
					      fd->Error=(errno!=ENOENT);
 | 
				
			||||||
      return(false);
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#ifdef _DJGPP
 | 
					 | 
				
			||||||
  fd->FileAttr=_chmod(FindMask,0);
 | 
					 | 
				
			||||||
#elif defined(_EMX)
 | 
					 | 
				
			||||||
  fd->FileAttr=st.st_attr;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  fd->FileAttr=st.st_mode;
 | 
					  fd->FileAttr=st.st_mode;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  fd->IsDir=IsDir(st.st_mode);
 | 
					 | 
				
			||||||
  fd->Size=st.st_size;
 | 
					  fd->Size=st.st_size;
 | 
				
			||||||
  fd->mtime=st.st_mtime;
 | 
					 | 
				
			||||||
  fd->atime=st.st_atime;
 | 
					 | 
				
			||||||
  fd->ctime=st.st_ctime;
 | 
					 | 
				
			||||||
  fd->FileTime=fd->mtime.GetDos();
 | 
					 | 
				
			||||||
  strcpy(fd->Name,FindMask);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *fd->NameW=0;
 | 
					#ifdef UNIX_TIME_NS
 | 
				
			||||||
#ifdef _APPLE
 | 
					  fd->mtime.SetUnixNS(st.st_mtim.tv_sec*(uint64)1000000000+st.st_mtim.tv_nsec);
 | 
				
			||||||
  if (!LowAscii(fd->Name))
 | 
					  fd->atime.SetUnixNS(st.st_atim.tv_sec*(uint64)1000000000+st.st_atim.tv_nsec);
 | 
				
			||||||
    UtfToWide(fd->Name,fd->NameW,sizeof(fd->NameW));
 | 
					  fd->ctime.SetUnixNS(st.st_ctim.tv_sec*(uint64)1000000000+st.st_ctim.tv_nsec);
 | 
				
			||||||
#elif defined(UNICODE_SUPPORTED)
 | 
					#else
 | 
				
			||||||
  if (!LowAscii(fd->Name) && UnicodeEnabled())
 | 
					  fd->mtime.SetUnix(st.st_mtime);
 | 
				
			||||||
    CharToWide(fd->Name,fd->NameW);
 | 
					  fd->atime.SetUnix(st.st_atime);
 | 
				
			||||||
 | 
					  fd->ctime.SetUnix(st.st_ctime);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wcsncpyz(fd->Name,FindMask,ASIZE(fd->Name));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  fd->Flags=0;
 | 
					  fd->Flags=0;
 | 
				
			||||||
  fd->IsDir=IsDir(fd->FileAttr);
 | 
					  fd->IsDir=IsDir(fd->FileAttr);
 | 
				
			||||||
  return(true);
 | 
					  fd->IsLink=IsLink(fd->FileAttr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
HANDLE FindFile::Win32Find(HANDLE hFind,const char *Mask,const wchar *MaskW,struct FindData *fd)
 | 
					HANDLE FindFile::Win32Find(HANDLE hFind,const wchar *Mask,FindData *fd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					  WIN32_FIND_DATA FindData;
 | 
				
			||||||
  if (WinNT())
 | 
					  if (hFind==INVALID_HANDLE_VALUE)
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    wchar WideMask[NM];
 | 
					    hFind=FindFirstFile(Mask,&FindData);
 | 
				
			||||||
    if (MaskW!=NULL && *MaskW!=0)
 | 
					 | 
				
			||||||
      strcpyw(WideMask,MaskW);
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      CharToWide(Mask,WideMask);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    WIN32_FIND_DATAW FindData;
 | 
					 | 
				
			||||||
    if (hFind==INVALID_HANDLE_VALUE)
 | 
					    if (hFind==INVALID_HANDLE_VALUE)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      hFind=FindFirstFileW(WideMask,&FindData);
 | 
					      wchar LongMask[NM];
 | 
				
			||||||
      if (hFind==INVALID_HANDLE_VALUE)
 | 
					      if (GetWinLongPath(Mask,LongMask,ASIZE(LongMask)))
 | 
				
			||||||
      {
 | 
					        hFind=FindFirstFile(LongMask,&FindData);
 | 
				
			||||||
        int SysErr=GetLastError();
 | 
					 | 
				
			||||||
        fd->Error=(SysErr!=ERROR_FILE_NOT_FOUND &&
 | 
					 | 
				
			||||||
                   SysErr!=ERROR_PATH_NOT_FOUND &&
 | 
					 | 
				
			||||||
                   SysErr!=ERROR_NO_MORE_FILES);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    if (hFind==INVALID_HANDLE_VALUE)
 | 
				
			||||||
      if (!FindNextFileW(hFind,&FindData))
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        hFind=INVALID_HANDLE_VALUE;
 | 
					 | 
				
			||||||
        fd->Error=GetLastError()!=ERROR_NO_MORE_FILES;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (hFind!=INVALID_HANDLE_VALUE)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      strcpyw(fd->NameW,WideMask);
 | 
					      int SysErr=GetLastError();
 | 
				
			||||||
      strcpyw(PointToName(fd->NameW),FindData.cFileName);
 | 
					      // We must not issue an error for "file not found" and "path not found",
 | 
				
			||||||
      WideToChar(fd->NameW,fd->Name);
 | 
					      // because it is normal to not find anything for wildcard mask when
 | 
				
			||||||
      fd->Size=INT32TO64(FindData.nFileSizeHigh,FindData.nFileSizeLow);
 | 
					      // archiving. Also searching for non-existent file is normal in some
 | 
				
			||||||
      fd->FileAttr=FindData.dwFileAttributes;
 | 
					      // other modules, like WinRAR scanning for winrar_theme_description.txt
 | 
				
			||||||
      WideToChar(FindData.cAlternateFileName,fd->ShortName);
 | 
					      // to check if any themes are available.
 | 
				
			||||||
      fd->ftCreationTime=FindData.ftCreationTime;
 | 
					      fd->Error=SysErr!=ERROR_FILE_NOT_FOUND && 
 | 
				
			||||||
      fd->ftLastAccessTime=FindData.ftLastAccessTime;
 | 
					                SysErr!=ERROR_PATH_NOT_FOUND &&
 | 
				
			||||||
      fd->ftLastWriteTime=FindData.ftLastWriteTime;
 | 
					                SysErr!=ERROR_NO_MORE_FILES;
 | 
				
			||||||
      fd->mtime=FindData.ftLastWriteTime;
 | 
					 | 
				
			||||||
      fd->ctime=FindData.ftCreationTime;
 | 
					 | 
				
			||||||
      fd->atime=FindData.ftLastAccessTime;
 | 
					 | 
				
			||||||
      fd->FileTime=fd->mtime.GetDos();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
      if (LowAscii(fd->NameW))
 | 
					 | 
				
			||||||
        *fd->NameW=0;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
 | 
					    if (!FindNextFile(hFind,&FindData))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      hFind=INVALID_HANDLE_VALUE;
 | 
				
			||||||
 | 
					      fd->Error=GetLastError()!=ERROR_NO_MORE_FILES;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (hFind!=INVALID_HANDLE_VALUE)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    char CharMask[NM];
 | 
					    wcsncpyz(fd->Name,Mask,ASIZE(fd->Name));
 | 
				
			||||||
    if (Mask!=NULL && *Mask!=0)
 | 
					    SetName(fd->Name,FindData.cFileName,ASIZE(fd->Name));
 | 
				
			||||||
      strcpy(CharMask,Mask);
 | 
					    fd->Size=INT32TO64(FindData.nFileSizeHigh,FindData.nFileSizeLow);
 | 
				
			||||||
    else
 | 
					    fd->FileAttr=FindData.dwFileAttributes;
 | 
				
			||||||
      WideToChar(MaskW,CharMask);
 | 
					    fd->ftCreationTime=FindData.ftCreationTime;
 | 
				
			||||||
 | 
					    fd->ftLastAccessTime=FindData.ftLastAccessTime;
 | 
				
			||||||
 | 
					    fd->ftLastWriteTime=FindData.ftLastWriteTime;
 | 
				
			||||||
 | 
					    fd->mtime.SetWinFT(&FindData.ftLastWriteTime);
 | 
				
			||||||
 | 
					    fd->ctime.SetWinFT(&FindData.ftCreationTime);
 | 
				
			||||||
 | 
					    fd->atime.SetWinFT(&FindData.ftLastAccessTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    WIN32_FIND_DATA FindData;
 | 
					 | 
				
			||||||
    if (hFind==INVALID_HANDLE_VALUE)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      hFind=FindFirstFile(CharMask,&FindData);
 | 
					 | 
				
			||||||
      if (hFind==INVALID_HANDLE_VALUE)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        int SysErr=GetLastError();
 | 
					 | 
				
			||||||
        fd->Error=SysErr!=ERROR_FILE_NOT_FOUND && SysErr!=ERROR_PATH_NOT_FOUND;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      if (!FindNextFile(hFind,&FindData))
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        hFind=INVALID_HANDLE_VALUE;
 | 
					 | 
				
			||||||
        fd->Error=GetLastError()!=ERROR_NO_MORE_FILES;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (hFind!=INVALID_HANDLE_VALUE)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      strcpy(fd->Name,CharMask);
 | 
					 | 
				
			||||||
      strcpy(PointToName(fd->Name),FindData.cFileName);
 | 
					 | 
				
			||||||
      CharToWide(fd->Name,fd->NameW);
 | 
					 | 
				
			||||||
      fd->Size=INT32TO64(FindData.nFileSizeHigh,FindData.nFileSizeLow);
 | 
					 | 
				
			||||||
      fd->FileAttr=FindData.dwFileAttributes;
 | 
					 | 
				
			||||||
      strcpy(fd->ShortName,FindData.cAlternateFileName);
 | 
					 | 
				
			||||||
      fd->ftCreationTime=FindData.ftCreationTime;
 | 
					 | 
				
			||||||
      fd->ftLastAccessTime=FindData.ftLastAccessTime;
 | 
					 | 
				
			||||||
      fd->ftLastWriteTime=FindData.ftLastWriteTime;
 | 
					 | 
				
			||||||
      fd->mtime=FindData.ftLastWriteTime;
 | 
					 | 
				
			||||||
      fd->ctime=FindData.ftCreationTime;
 | 
					 | 
				
			||||||
      fd->atime=FindData.ftLastAccessTime;
 | 
					 | 
				
			||||||
      fd->FileTime=fd->mtime.GetDos();
 | 
					 | 
				
			||||||
      if (LowAscii(fd->Name))
 | 
					 | 
				
			||||||
        *fd->NameW=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  fd->Flags=0;
 | 
					  fd->Flags=0;
 | 
				
			||||||
  return(hFind);
 | 
					  return hFind;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,22 +2,20 @@
 | 
				
			||||||
#define _RAR_FINDDATA_
 | 
					#define _RAR_FINDDATA_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum FINDDATA_FLAGS {
 | 
					enum FINDDATA_FLAGS {
 | 
				
			||||||
  FDDF_SECONDDIR=1  // Second encounter of same directory in SCAN_GETDIRSTWICE ScanTree mode
 | 
					  FDDF_SECONDDIR=1  // Second encounter of same directory in SCAN_GETDIRSTWICE ScanTree mode.
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct FindData
 | 
					struct FindData
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char Name[NM];
 | 
					  wchar Name[NM];
 | 
				
			||||||
  wchar NameW[NM];
 | 
					  uint64 Size;
 | 
				
			||||||
  int64 Size;
 | 
					 | 
				
			||||||
  uint FileAttr;
 | 
					  uint FileAttr;
 | 
				
			||||||
  uint FileTime;
 | 
					 | 
				
			||||||
  bool IsDir;
 | 
					  bool IsDir;
 | 
				
			||||||
 | 
					  bool IsLink;
 | 
				
			||||||
  RarTime mtime;
 | 
					  RarTime mtime;
 | 
				
			||||||
  RarTime ctime;
 | 
					  RarTime ctime;
 | 
				
			||||||
  RarTime atime;
 | 
					  RarTime atime;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  char ShortName[NM];
 | 
					 | 
				
			||||||
  FILETIME ftCreationTime; 
 | 
					  FILETIME ftCreationTime; 
 | 
				
			||||||
  FILETIME ftLastAccessTime; 
 | 
					  FILETIME ftLastAccessTime; 
 | 
				
			||||||
  FILETIME ftLastWriteTime; 
 | 
					  FILETIME ftLastWriteTime; 
 | 
				
			||||||
| 
						 | 
					@ -29,14 +27,13 @@ struct FindData
 | 
				
			||||||
class FindFile
 | 
					class FindFile
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    static HANDLE Win32Find(HANDLE hFind,const char *Mask,const wchar *MaskW,struct FindData *fd);
 | 
					    static HANDLE Win32Find(HANDLE hFind,const wchar *Mask,FindData *fd);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char FindMask[NM];
 | 
					    wchar FindMask[NM];
 | 
				
			||||||
    wchar FindMaskW[NM];
 | 
					 | 
				
			||||||
    bool FirstCall;
 | 
					    bool FirstCall;
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    HANDLE hFind;
 | 
					    HANDLE hFind;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    DIR *dirp;
 | 
					    DIR *dirp;
 | 
				
			||||||
| 
						 | 
					@ -44,10 +41,9 @@ class FindFile
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    FindFile();
 | 
					    FindFile();
 | 
				
			||||||
    ~FindFile();
 | 
					    ~FindFile();
 | 
				
			||||||
    void SetMask(const char *FindMask);
 | 
					    void SetMask(const wchar *Mask);
 | 
				
			||||||
    void SetMaskW(const wchar *FindMaskW);
 | 
					    bool Next(FindData *fd,bool GetSymLink=false);
 | 
				
			||||||
    bool Next(struct FindData *fd,bool GetSymLink=false);
 | 
					    static bool FastFind(const wchar *FindMask,FindData *fd,bool GetSymLink=false);
 | 
				
			||||||
    static bool FastFind(const char *FindMask,const wchar *FindMaskW,struct FindData *fd,bool GetSymLink=false);
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,30 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BitInput::BitInput()
 | 
					BitInput::BitInput(bool AllocBuffer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // getbits attempts to read data from InAddr, InAddr+1, InAddr+2 positions.
 | 
					  ExternalBuffer=false;
 | 
				
			||||||
  // So let's allocate two additional bytes for situation, when we need to
 | 
					  if (AllocBuffer)
 | 
				
			||||||
  // read only 1 byte from the last position of buffer and avoid a crash
 | 
					  {
 | 
				
			||||||
  // from access to next 2 bytes, which contents we do not need.
 | 
					    // getbits32 attempts to read data from InAddr, ... InAddr+3 positions.
 | 
				
			||||||
  InBuf=new byte[MAX_SIZE+2];
 | 
					    // So let's allocate 3 additional bytes for situation, when we need to
 | 
				
			||||||
 | 
					    // read only 1 byte from the last position of buffer and avoid a crash
 | 
				
			||||||
 | 
					    // from access to next 3 bytes, which contents we do not need.
 | 
				
			||||||
 | 
					    size_t BufSize=MAX_SIZE+3;
 | 
				
			||||||
 | 
					    InBuf=new byte[BufSize];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Ensure that we get predictable results when accessing bytes in area
 | 
				
			||||||
 | 
					    // not filled with read data.
 | 
				
			||||||
 | 
					    memset(InBuf,0,BufSize);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    InBuf=NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BitInput::~BitInput()
 | 
					BitInput::~BitInput()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  delete[] InBuf;
 | 
					  if (!ExternalBuffer)
 | 
				
			||||||
 | 
					    delete[] InBuf;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,5 +38,15 @@ void BitInput::faddbits(uint Bits)
 | 
				
			||||||
uint BitInput::fgetbits()
 | 
					uint BitInput::fgetbits()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // Function wrapped version of inline getbits to save code size.
 | 
					  // Function wrapped version of inline getbits to save code size.
 | 
				
			||||||
  return(getbits());
 | 
					  return getbits();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BitInput::SetExternalBuffer(byte *Buf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (InBuf!=NULL && !ExternalBuffer)
 | 
				
			||||||
 | 
					    delete[] InBuf;
 | 
				
			||||||
 | 
					  InBuf=Buf;
 | 
				
			||||||
 | 
					  ExternalBuffer=true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,11 +5,13 @@ class BitInput
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    enum BufferSize {MAX_SIZE=0x8000}; // Size of input buffer.
 | 
					    enum BufferSize {MAX_SIZE=0x8000}; // Size of input buffer.
 | 
				
			||||||
  protected:
 | 
					
 | 
				
			||||||
    int InAddr; // Curent byte position in the buffer.
 | 
					    int InAddr; // Curent byte position in the buffer.
 | 
				
			||||||
    int InBit;  // Current bit position in the current byte.
 | 
					    int InBit;  // Current bit position in the current byte.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool ExternalBuffer;
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    BitInput();
 | 
					    BitInput(bool AllocBuffer);
 | 
				
			||||||
    ~BitInput();
 | 
					    ~BitInput();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    byte *InBuf; // Dynamically allocated input buffer.
 | 
					    byte *InBuf; // Dynamically allocated input buffer.
 | 
				
			||||||
| 
						 | 
					@ -35,7 +37,20 @@ class BitInput
 | 
				
			||||||
      BitField|=(uint)InBuf[InAddr+1] << 8;
 | 
					      BitField|=(uint)InBuf[InAddr+1] << 8;
 | 
				
			||||||
      BitField|=(uint)InBuf[InAddr+2];
 | 
					      BitField|=(uint)InBuf[InAddr+2];
 | 
				
			||||||
      BitField >>= (8-InBit);
 | 
					      BitField >>= (8-InBit);
 | 
				
			||||||
      return(BitField & 0xffff);
 | 
					      return BitField & 0xffff;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Return 32 bits from current position in the buffer.
 | 
				
			||||||
 | 
					    // Bit at (InAddr,InBit) has the highest position in returning data.
 | 
				
			||||||
 | 
					    uint getbits32()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      uint BitField=(uint)InBuf[InAddr] << 24;
 | 
				
			||||||
 | 
					      BitField|=(uint)InBuf[InAddr+1] << 16;
 | 
				
			||||||
 | 
					      BitField|=(uint)InBuf[InAddr+2] << 8;
 | 
				
			||||||
 | 
					      BitField|=(uint)InBuf[InAddr+3];
 | 
				
			||||||
 | 
					      BitField <<= InBit;
 | 
				
			||||||
 | 
					      BitField|=(uint)InBuf[InAddr+4] >> (8-InBit);
 | 
				
			||||||
 | 
					      return BitField & 0xffffffff;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    void faddbits(uint Bits);
 | 
					    void faddbits(uint Bits);
 | 
				
			||||||
| 
						 | 
					@ -45,7 +60,9 @@ class BitInput
 | 
				
			||||||
    // if buffer will be overflown.
 | 
					    // if buffer will be overflown.
 | 
				
			||||||
    bool Overflow(uint IncPtr) 
 | 
					    bool Overflow(uint IncPtr) 
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      return(InAddr+IncPtr>=MAX_SIZE);
 | 
					      return InAddr+IncPtr>=MAX_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void SetExternalBuffer(byte *Buf);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,7 @@
 | 
				
			||||||
#define INCLUDEGLOBAL
 | 
					#define INCLUDEGLOBAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__BORLANDC__) || defined(_MSC_VER)
 | 
				
			||||||
 | 
					#pragma hdrstop
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					bool ExtractHardlink(wchar *NameNew,wchar *NameExisting,size_t NameExistingSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  SlashToNative(NameExisting,NameExisting,NameExistingSize); // Not needed for RAR 5.1+ archives.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!FileExist(NameExisting))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    uiMsg(UIERROR_HLINKCREATE,NameNew);
 | 
				
			||||||
 | 
					    uiMsg(UIERROR_NOLINKTARGET);
 | 
				
			||||||
 | 
					    ErrHandler.SetErrorCode(RARX_CREATE);
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  CreatePath(NameNew,true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  bool Success=CreateHardLink(NameNew,NameExisting,NULL)!=0;
 | 
				
			||||||
 | 
					  if (!Success)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    uiMsg(UIERROR_HLINKCREATE,NameNew);
 | 
				
			||||||
 | 
					    ErrHandler.SysErrMsg();
 | 
				
			||||||
 | 
					    ErrHandler.SetErrorCode(RARX_CREATE);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
 | 
					#elif defined(_UNIX)
 | 
				
			||||||
 | 
					  char NameExistingA[NM],NameNewA[NM];
 | 
				
			||||||
 | 
					  WideToChar(NameExisting,NameExistingA,ASIZE(NameExistingA));
 | 
				
			||||||
 | 
					  WideToChar(NameNew,NameNewA,ASIZE(NameNewA));
 | 
				
			||||||
 | 
					  bool Success=link(NameExistingA,NameNewA)==0;
 | 
				
			||||||
 | 
					  if (!Success)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    uiMsg(UIERROR_HLINKCREATE,NameNew);
 | 
				
			||||||
 | 
					    ErrHandler.SysErrMsg();
 | 
				
			||||||
 | 
					    ErrHandler.SetErrorCode(RARX_CREATE);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return Success;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,135 @@
 | 
				
			||||||
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void HashValue::Init(HASH_TYPE Type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  HashValue::Type=Type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Zero length data CRC32 is 0. It is important to set it when creating
 | 
				
			||||||
 | 
					  // headers with no following data like directories or symlinks.
 | 
				
			||||||
 | 
					  if (Type==HASH_RAR14 || Type==HASH_CRC32)
 | 
				
			||||||
 | 
					    CRC32=0;
 | 
				
			||||||
 | 
					  if (Type==HASH_BLAKE2)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // dd0e891776933f43c7d032b08a917e25741f8aa9a12c12e1cac8801500f2ca4f
 | 
				
			||||||
 | 
					    // is BLAKE2sp hash of empty data. We init the structure to this value,
 | 
				
			||||||
 | 
					    // so if we create a file or service header with no following data like
 | 
				
			||||||
 | 
					    // "file copy" or "symlink", we set the checksum to proper value avoiding
 | 
				
			||||||
 | 
					    // additional header type or size checks when extracting.
 | 
				
			||||||
 | 
					    static byte EmptyHash[32]={
 | 
				
			||||||
 | 
					      0xdd, 0x0e, 0x89, 0x17, 0x76, 0x93, 0x3f, 0x43,
 | 
				
			||||||
 | 
					      0xc7, 0xd0, 0x32, 0xb0, 0x8a, 0x91, 0x7e, 0x25,
 | 
				
			||||||
 | 
					      0x74, 0x1f, 0x8a, 0xa9, 0xa1, 0x2c, 0x12, 0xe1,
 | 
				
			||||||
 | 
					      0xca, 0xc8, 0x80, 0x15, 0x00, 0xf2, 0xca, 0x4f
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    memcpy(Digest,EmptyHash,sizeof(Digest));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool HashValue::operator == (const HashValue &cmp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (Type==HASH_NONE || cmp.Type==HASH_NONE)
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  if (Type==HASH_RAR14 && cmp.Type==HASH_RAR14 || 
 | 
				
			||||||
 | 
					      Type==HASH_CRC32 && cmp.Type==HASH_CRC32)
 | 
				
			||||||
 | 
					    return CRC32==cmp.CRC32;
 | 
				
			||||||
 | 
					  if (Type==HASH_BLAKE2 && cmp.Type==HASH_BLAKE2)
 | 
				
			||||||
 | 
					    return memcmp(Digest,cmp.Digest,sizeof(Digest))==0;
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DataHash::DataHash()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  blake2ctx=NULL;
 | 
				
			||||||
 | 
					  HashType=HASH_NONE;
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					  ThPool=NULL;
 | 
				
			||||||
 | 
					  MaxThreads=0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DataHash::~DataHash()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					  delete ThPool;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  cleandata(&CurCRC32, sizeof(CurCRC32));
 | 
				
			||||||
 | 
					  if (blake2ctx!=NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    cleandata(blake2ctx, sizeof(blake2sp_state));
 | 
				
			||||||
 | 
					    delete blake2ctx;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DataHash::Init(HASH_TYPE Type,uint MaxThreads)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (blake2ctx==NULL)
 | 
				
			||||||
 | 
					    blake2ctx=new blake2sp_state;
 | 
				
			||||||
 | 
					  HashType=Type;
 | 
				
			||||||
 | 
					  if (Type==HASH_RAR14)
 | 
				
			||||||
 | 
					    CurCRC32=0;
 | 
				
			||||||
 | 
					  if (Type==HASH_CRC32)
 | 
				
			||||||
 | 
					    CurCRC32=0xffffffff; // Initial CRC32 value.
 | 
				
			||||||
 | 
					  if (Type==HASH_BLAKE2)
 | 
				
			||||||
 | 
					    blake2sp_init(blake2ctx);
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					  DataHash::MaxThreads=Min(MaxThreads,MaxHashThreads);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DataHash::Update(const void *Data,size_t DataSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					  if (HashType==HASH_RAR14)
 | 
				
			||||||
 | 
					    CurCRC32=Checksum14((ushort)CurCRC32,Data,DataSize);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  if (HashType==HASH_CRC32)
 | 
				
			||||||
 | 
					    CurCRC32=CRC32(CurCRC32,Data,DataSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (HashType==HASH_BLAKE2)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					    if (MaxThreads>1 && ThPool==NULL)
 | 
				
			||||||
 | 
					      ThPool=new ThreadPool(BLAKE2_THREADS_NUMBER);
 | 
				
			||||||
 | 
					    blake2ctx->ThPool=ThPool;
 | 
				
			||||||
 | 
					    blake2ctx->MaxThreads=MaxThreads;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    blake2sp_update( blake2ctx, (byte *)Data, DataSize);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DataHash::Result(HashValue *Result)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  Result->Type=HashType;
 | 
				
			||||||
 | 
					  if (HashType==HASH_RAR14)
 | 
				
			||||||
 | 
					    Result->CRC32=CurCRC32;
 | 
				
			||||||
 | 
					  if (HashType==HASH_CRC32)
 | 
				
			||||||
 | 
					    Result->CRC32=CurCRC32^0xffffffff;
 | 
				
			||||||
 | 
					  if (HashType==HASH_BLAKE2)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Preserve the original context, so we can continue hashing if necessary.
 | 
				
			||||||
 | 
					    blake2sp_state res=*blake2ctx;
 | 
				
			||||||
 | 
					    blake2sp_final(&res,Result->Digest);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint DataHash::GetCRC32()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return HashType==HASH_CRC32 ? CurCRC32^0xffffffff : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool DataHash::Cmp(HashValue *CmpValue,byte *Key)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  HashValue Final;
 | 
				
			||||||
 | 
					  Result(&Final);
 | 
				
			||||||
 | 
					  if (Key!=NULL)
 | 
				
			||||||
 | 
					    ConvertHashToMAC(&Final,Key);
 | 
				
			||||||
 | 
					  return Final==*CmpValue;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					#ifndef _RAR_DATAHASH_
 | 
				
			||||||
 | 
					#define _RAR_DATAHASH_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum HASH_TYPE {HASH_NONE,HASH_RAR14,HASH_CRC32,HASH_BLAKE2};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct HashValue
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  void Init(HASH_TYPE Type);
 | 
				
			||||||
 | 
					  bool operator == (const HashValue &cmp);
 | 
				
			||||||
 | 
					  bool operator != (const HashValue &cmp) {return !(*this==cmp);}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HASH_TYPE Type;
 | 
				
			||||||
 | 
					  union
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    uint CRC32;
 | 
				
			||||||
 | 
					    byte Digest[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					class ThreadPool;
 | 
				
			||||||
 | 
					class DataHash;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DataHash
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  private:
 | 
				
			||||||
 | 
					    HASH_TYPE HashType;
 | 
				
			||||||
 | 
					    uint CurCRC32;
 | 
				
			||||||
 | 
					    blake2sp_state *blake2ctx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					    ThreadPool *ThPool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint MaxThreads;
 | 
				
			||||||
 | 
					    // Upper limit for maximum threads to prevent wasting threads in pool.
 | 
				
			||||||
 | 
					    static const uint MaxHashThreads=8;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
					    DataHash();
 | 
				
			||||||
 | 
					    ~DataHash();
 | 
				
			||||||
 | 
					    void Init(HASH_TYPE Type,uint MaxThreads);
 | 
				
			||||||
 | 
					    void Update(const void *Data,size_t DataSize);
 | 
				
			||||||
 | 
					    void Result(HashValue *Result);
 | 
				
			||||||
 | 
					    uint GetCRC32();
 | 
				
			||||||
 | 
					    bool Cmp(HashValue *CmpValue,byte *Key);
 | 
				
			||||||
 | 
					    HASH_TYPE Type() {return HashType;}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void FileHeader::Reset(size_t SubDataSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  SubData.Alloc(SubDataSize);
 | 
				
			||||||
 | 
					  BaseBlock::Reset();
 | 
				
			||||||
 | 
					  FileHash.Init(HASH_NONE);
 | 
				
			||||||
 | 
					  mtime.Reset();
 | 
				
			||||||
 | 
					  atime.Reset();
 | 
				
			||||||
 | 
					  ctime.Reset();
 | 
				
			||||||
 | 
					  SplitBefore=false;
 | 
				
			||||||
 | 
					  SplitAfter=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  UnknownUnpSize=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SubFlags=0; // Important for RAR 3.0 subhead.
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  CryptMethod=CRYPT_NONE;
 | 
				
			||||||
 | 
					  Encrypted=false;
 | 
				
			||||||
 | 
					  SaltSet=false;
 | 
				
			||||||
 | 
					  UsePswCheck=false;
 | 
				
			||||||
 | 
					  UseHashKey=false;
 | 
				
			||||||
 | 
					  Lg2Count=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Solid=false;
 | 
				
			||||||
 | 
					  Dir=false;
 | 
				
			||||||
 | 
					  WinSize=0;
 | 
				
			||||||
 | 
					  Inherited=false;
 | 
				
			||||||
 | 
					  SubBlock=false;
 | 
				
			||||||
 | 
					  CommentInHeader=false;
 | 
				
			||||||
 | 
					  Version=false;
 | 
				
			||||||
 | 
					  LargeFile=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RedirType=FSREDIR_NONE;
 | 
				
			||||||
 | 
					  DirTarget=false;
 | 
				
			||||||
 | 
					  UnixOwnerSet=false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FileHeader& FileHeader::operator = (FileHeader &hd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  SubData.Reset();
 | 
				
			||||||
 | 
					  memcpy(this,&hd,sizeof(*this));
 | 
				
			||||||
 | 
					  SubData.CleanData();
 | 
				
			||||||
 | 
					  SubData=hd.SubData;
 | 
				
			||||||
 | 
					  return *this;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainHeader::Reset()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  HighPosAV=0;
 | 
				
			||||||
 | 
					  PosAV=0;
 | 
				
			||||||
 | 
					  CommentInHeader=false;
 | 
				
			||||||
 | 
					  PackComment=false;
 | 
				
			||||||
 | 
					  Locator=false;
 | 
				
			||||||
 | 
					  QOpenOffset=0;
 | 
				
			||||||
 | 
					  QOpenMaxSize=0;
 | 
				
			||||||
 | 
					  RROffset=0;
 | 
				
			||||||
 | 
					  RRMaxSize=0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,33 +1,31 @@
 | 
				
			||||||
#ifndef _RAR_HEADERS_
 | 
					#ifndef _RAR_HEADERS_
 | 
				
			||||||
#define _RAR_HEADERS_
 | 
					#define _RAR_HEADERS_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  SIZEOF_MARKHEAD         7
 | 
					#define  SIZEOF_MARKHEAD3        7 // Size of RAR 4.x archive mark header.
 | 
				
			||||||
#define  SIZEOF_OLDMHD           7
 | 
					#define  SIZEOF_MAINHEAD14       7 // Size of RAR 1.4 main archive header.
 | 
				
			||||||
#define  SIZEOF_NEWMHD          13
 | 
					#define  SIZEOF_MAINHEAD3       13 // Size of RAR 4.x main archive header.
 | 
				
			||||||
#define  SIZEOF_OLDLHD          21
 | 
					#define  SIZEOF_FILEHEAD14      21 // Size of RAR 1.4 file header.
 | 
				
			||||||
#define  SIZEOF_NEWLHD          32
 | 
					#define  SIZEOF_FILEHEAD3       32 // Size of RAR 3.0 file header.
 | 
				
			||||||
#define  SIZEOF_SHORTBLOCKHEAD   7
 | 
					#define  SIZEOF_SHORTBLOCKHEAD   7
 | 
				
			||||||
#define  SIZEOF_LONGBLOCKHEAD   11
 | 
					#define  SIZEOF_LONGBLOCKHEAD   11
 | 
				
			||||||
#define  SIZEOF_SUBBLOCKHEAD    14
 | 
					#define  SIZEOF_SUBBLOCKHEAD    14
 | 
				
			||||||
#define  SIZEOF_COMMHEAD        13
 | 
					#define  SIZEOF_COMMHEAD        13
 | 
				
			||||||
#define  SIZEOF_PROTECTHEAD     26
 | 
					#define  SIZEOF_PROTECTHEAD     26
 | 
				
			||||||
#define  SIZEOF_AVHEAD          14
 | 
					 | 
				
			||||||
#define  SIZEOF_SIGNHEAD        15
 | 
					 | 
				
			||||||
#define  SIZEOF_UOHEAD          18
 | 
					#define  SIZEOF_UOHEAD          18
 | 
				
			||||||
#define  SIZEOF_MACHEAD         22
 | 
					 | 
				
			||||||
#define  SIZEOF_EAHEAD          24
 | 
					 | 
				
			||||||
#define  SIZEOF_BEEAHEAD        24
 | 
					 | 
				
			||||||
#define  SIZEOF_STREAMHEAD      26
 | 
					#define  SIZEOF_STREAMHEAD      26
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  PACK_VER               29
 | 
					#define  VER_PACK               29U
 | 
				
			||||||
#define  PACK_CRYPT_VER         29
 | 
					#define  VER_PACK5              50U // It is stored as 0, but we subtract 50 when saving an archive.
 | 
				
			||||||
#define  UNP_VER                36
 | 
					#define  VER_UNPACK             29U
 | 
				
			||||||
#define  CRYPT_VER              29
 | 
					#define  VER_UNPACK5            50U // It is stored as 0, but we add 50 when reading an archive.
 | 
				
			||||||
#define  AV_VER                 20
 | 
					#define  VER_UNKNOWN          9999U // Just some large value.
 | 
				
			||||||
#define  PROTECT_VER            20
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  MHD_VOLUME         0x0001U
 | 
					#define  MHD_VOLUME         0x0001U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Old style main archive comment embed into main archive header. Must not
 | 
				
			||||||
 | 
					// be used in new archives anymore.
 | 
				
			||||||
#define  MHD_COMMENT        0x0002U
 | 
					#define  MHD_COMMENT        0x0002U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  MHD_LOCK           0x0004U
 | 
					#define  MHD_LOCK           0x0004U
 | 
				
			||||||
#define  MHD_SOLID          0x0008U
 | 
					#define  MHD_SOLID          0x0008U
 | 
				
			||||||
#define  MHD_PACK_COMMENT   0x0010U
 | 
					#define  MHD_PACK_COMMENT   0x0010U
 | 
				
			||||||
| 
						 | 
					@ -36,14 +34,19 @@
 | 
				
			||||||
#define  MHD_PROTECT        0x0040U
 | 
					#define  MHD_PROTECT        0x0040U
 | 
				
			||||||
#define  MHD_PASSWORD       0x0080U
 | 
					#define  MHD_PASSWORD       0x0080U
 | 
				
			||||||
#define  MHD_FIRSTVOLUME    0x0100U
 | 
					#define  MHD_FIRSTVOLUME    0x0100U
 | 
				
			||||||
#define  MHD_ENCRYPTVER     0x0200U
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  LHD_SPLIT_BEFORE   0x0001U
 | 
					#define  LHD_SPLIT_BEFORE   0x0001U
 | 
				
			||||||
#define  LHD_SPLIT_AFTER    0x0002U
 | 
					#define  LHD_SPLIT_AFTER    0x0002U
 | 
				
			||||||
#define  LHD_PASSWORD       0x0004U
 | 
					#define  LHD_PASSWORD       0x0004U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Old style file comment embed into file header. Must not be used
 | 
				
			||||||
 | 
					// in new archives anymore.
 | 
				
			||||||
#define  LHD_COMMENT        0x0008U
 | 
					#define  LHD_COMMENT        0x0008U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// For non-file subheaders it denotes 'subblock having a parent file' flag.
 | 
				
			||||||
#define  LHD_SOLID          0x0010U
 | 
					#define  LHD_SOLID          0x0010U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  LHD_WINDOWMASK     0x00e0U
 | 
					#define  LHD_WINDOWMASK     0x00e0U
 | 
				
			||||||
#define  LHD_WINDOW64       0x0000U
 | 
					#define  LHD_WINDOW64       0x0000U
 | 
				
			||||||
#define  LHD_WINDOW128      0x0020U
 | 
					#define  LHD_WINDOW128      0x0020U
 | 
				
			||||||
| 
						 | 
					@ -59,96 +62,98 @@
 | 
				
			||||||
#define  LHD_SALT           0x0400U
 | 
					#define  LHD_SALT           0x0400U
 | 
				
			||||||
#define  LHD_VERSION        0x0800U
 | 
					#define  LHD_VERSION        0x0800U
 | 
				
			||||||
#define  LHD_EXTTIME        0x1000U
 | 
					#define  LHD_EXTTIME        0x1000U
 | 
				
			||||||
#define  LHD_EXTFLAGS       0x2000U
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  SKIP_IF_UNKNOWN    0x4000U
 | 
					#define  SKIP_IF_UNKNOWN    0x4000U
 | 
				
			||||||
#define  LONG_BLOCK         0x8000U
 | 
					#define  LONG_BLOCK         0x8000U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  EARC_NEXT_VOLUME   0x0001U // not last volume
 | 
					#define  EARC_NEXT_VOLUME   0x0001U // Not last volume.
 | 
				
			||||||
#define  EARC_DATACRC       0x0002U // store CRC32 of RAR archive (now used only in volumes)
 | 
					#define  EARC_DATACRC       0x0002U // Store CRC32 of RAR archive (now is used only in volumes).
 | 
				
			||||||
#define  EARC_REVSPACE      0x0004U // reserve space for end of REV file 7 byte record
 | 
					#define  EARC_REVSPACE      0x0004U // Reserve space for end of REV file 7 byte record.
 | 
				
			||||||
#define  EARC_VOLNUMBER     0x0008U // store a number of current volume
 | 
					#define  EARC_VOLNUMBER     0x0008U // Store a number of current volume.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum HEADER_TYPE {
 | 
					enum HEADER_TYPE {
 | 
				
			||||||
  MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74,COMM_HEAD=0x75,AV_HEAD=0x76,
 | 
					  // RAR 5.0 header types.
 | 
				
			||||||
  SUB_HEAD=0x77,PROTECT_HEAD=0x78,SIGN_HEAD=0x79,NEWSUB_HEAD=0x7a,
 | 
					  HEAD_MARK=0x00, HEAD_MAIN=0x01, HEAD_FILE=0x02, HEAD_SERVICE=0x03,
 | 
				
			||||||
  ENDARC_HEAD=0x7b
 | 
					  HEAD_CRYPT=0x04, HEAD_ENDARC=0x05, HEAD_UNKNOWN=0xff,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // RAR 1.5 - 4.x header types.
 | 
				
			||||||
 | 
					  HEAD3_MARK=0x72,HEAD3_MAIN=0x73,HEAD3_FILE=0x74,HEAD3_CMT=0x75,
 | 
				
			||||||
 | 
					  HEAD3_AV=0x76,HEAD3_OLDSERVICE=0x77,HEAD3_PROTECT=0x78,HEAD3_SIGN=0x79,
 | 
				
			||||||
 | 
					  HEAD3_SERVICE=0x7a,HEAD3_ENDARC=0x7b
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR 2.9 and earlier.
 | 
				
			||||||
enum { EA_HEAD=0x100,UO_HEAD=0x101,MAC_HEAD=0x102,BEEA_HEAD=0x103,
 | 
					enum { EA_HEAD=0x100,UO_HEAD=0x101,MAC_HEAD=0x102,BEEA_HEAD=0x103,
 | 
				
			||||||
       NTACL_HEAD=0x104,STREAM_HEAD=0x105 };
 | 
					       NTACL_HEAD=0x104,STREAM_HEAD=0x105 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Internal implementation, depends on archive format version.
 | 
				
			||||||
enum HOST_SYSTEM {
 | 
					enum HOST_SYSTEM {
 | 
				
			||||||
 | 
					  // RAR 5.0 host OS
 | 
				
			||||||
 | 
					  HOST5_WINDOWS=0,HOST5_UNIX=1,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // RAR 3.0 host OS.
 | 
				
			||||||
  HOST_MSDOS=0,HOST_OS2=1,HOST_WIN32=2,HOST_UNIX=3,HOST_MACOS=4,
 | 
					  HOST_MSDOS=0,HOST_OS2=1,HOST_WIN32=2,HOST_UNIX=3,HOST_MACOS=4,
 | 
				
			||||||
  HOST_BEOS=5,HOST_MAX
 | 
					  HOST_BEOS=5,HOST_MAX
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SUBHEAD_TYPE_CMT      "CMT"
 | 
					// Unified archive format independent implementation.
 | 
				
			||||||
#define SUBHEAD_TYPE_ACL      "ACL"
 | 
					enum HOST_SYSTEM_TYPE {
 | 
				
			||||||
#define SUBHEAD_TYPE_STREAM   "STM"
 | 
					  HSYS_WINDOWS, HSYS_UNIX, HSYS_UNKNOWN
 | 
				
			||||||
#define SUBHEAD_TYPE_UOWNER   "UOW"
 | 
					};
 | 
				
			||||||
#define SUBHEAD_TYPE_AV       "AV"
 | 
					
 | 
				
			||||||
#define SUBHEAD_TYPE_RR       "RR"
 | 
					
 | 
				
			||||||
#define SUBHEAD_TYPE_OS2EA    "EA2"
 | 
					// We also use these values in extra field, so do not modify them.
 | 
				
			||||||
#define SUBHEAD_TYPE_BEOSEA   "EABE"
 | 
					enum FILE_SYSTEM_REDIRECT {
 | 
				
			||||||
 | 
					  FSREDIR_NONE=0, FSREDIR_UNIXSYMLINK, FSREDIR_WINSYMLINK, FSREDIR_JUNCTION,
 | 
				
			||||||
 | 
					  FSREDIR_HARDLINK, FSREDIR_FILECOPY
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_CMT      L"CMT"
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_QOPEN    L"QO"
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_ACL      L"ACL"
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_STREAM   L"STM"
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_UOWNER   L"UOW"
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_AV       L"AV"
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_RR       L"RR"
 | 
				
			||||||
 | 
					#define SUBHEAD_TYPE_OS2EA    L"EA2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* new file inherits a subblock when updating a host file */
 | 
					/* new file inherits a subblock when updating a host file */
 | 
				
			||||||
#define SUBHEAD_FLAGS_INHERITED    0x80000000
 | 
					#define SUBHEAD_FLAGS_INHERITED    0x80000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SUBHEAD_FLAGS_CMT_UNICODE  0x00000001
 | 
					#define SUBHEAD_FLAGS_CMT_UNICODE  0x00000001
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct OldMainHeader
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  byte Mark[4];
 | 
					 | 
				
			||||||
  ushort HeadSize;
 | 
					 | 
				
			||||||
  byte Flags;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct OldFileHeader
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  uint PackSize;
 | 
					 | 
				
			||||||
  uint UnpSize;
 | 
					 | 
				
			||||||
  ushort FileCRC;
 | 
					 | 
				
			||||||
  ushort HeadSize;
 | 
					 | 
				
			||||||
  uint FileTime;
 | 
					 | 
				
			||||||
  byte FileAttr;
 | 
					 | 
				
			||||||
  byte Flags;
 | 
					 | 
				
			||||||
  byte UnpVer;
 | 
					 | 
				
			||||||
  byte NameSize;
 | 
					 | 
				
			||||||
  byte Method;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct MarkHeader
 | 
					struct MarkHeader
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  byte Mark[7];
 | 
					  byte Mark[8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Following fields are virtual and not present in real blocks.
 | 
				
			||||||
 | 
					  uint HeadSize;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct BaseBlock
 | 
					struct BaseBlock
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ushort HeadCRC;
 | 
					  uint HeadCRC;  // 'ushort' for RAR 1.5.
 | 
				
			||||||
  HEADER_TYPE HeadType;//byte
 | 
					  HEADER_TYPE HeaderType; // 1 byte for RAR 1.5.
 | 
				
			||||||
  ushort Flags;
 | 
					  uint Flags;    // 'ushort' for RAR 1.5.
 | 
				
			||||||
  ushort HeadSize;
 | 
					  uint HeadSize; // 'ushort' for RAR 1.5, up to 2 MB for RAR 5.0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool IsSubBlock()
 | 
					  bool SkipIfUnknown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Reset()
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (HeadType==SUB_HEAD)
 | 
					    SkipIfUnknown=false;
 | 
				
			||||||
      return(true);
 | 
					 | 
				
			||||||
    if (HeadType==NEWSUB_HEAD && (Flags & LHD_SOLID)!=0)
 | 
					 | 
				
			||||||
      return(true);
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct BlockHeader:BaseBlock
 | 
					struct BlockHeader:BaseBlock
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  union {
 | 
					  uint DataSize;
 | 
				
			||||||
    uint DataSize;
 | 
					 | 
				
			||||||
    uint PackSize;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,75 +161,141 @@ struct MainHeader:BaseBlock
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ushort HighPosAV;
 | 
					  ushort HighPosAV;
 | 
				
			||||||
  uint PosAV;
 | 
					  uint PosAV;
 | 
				
			||||||
  byte EncryptVer;
 | 
					  bool CommentInHeader;
 | 
				
			||||||
 | 
					  bool PackComment; // For RAR 1.4 archive format only.
 | 
				
			||||||
 | 
					  bool Locator;
 | 
				
			||||||
 | 
					  uint64 QOpenOffset;  // Offset of quick list record.
 | 
				
			||||||
 | 
					  uint64 QOpenMaxSize; // Maximum size of QOpen offset in locator extra field.
 | 
				
			||||||
 | 
					  uint64 RROffset;     // Offset of recovery record.
 | 
				
			||||||
 | 
					  uint64 RRMaxSize;    // Maximum size of RR offset in locator extra field.
 | 
				
			||||||
 | 
					  void Reset();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SALT_SIZE     8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct FileHeader:BlockHeader
 | 
					struct FileHeader:BlockHeader
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  uint UnpSize;
 | 
					 | 
				
			||||||
  byte HostOS;
 | 
					  byte HostOS;
 | 
				
			||||||
  uint FileCRC;
 | 
					  uint UnpVer; // It is 1 byte in RAR29 and bit field in RAR5.
 | 
				
			||||||
  uint FileTime;
 | 
					 | 
				
			||||||
  byte UnpVer;
 | 
					 | 
				
			||||||
  byte Method;
 | 
					  byte Method;
 | 
				
			||||||
  ushort NameSize;
 | 
					 | 
				
			||||||
  union {
 | 
					  union {
 | 
				
			||||||
    uint FileAttr;
 | 
					    uint FileAttr;
 | 
				
			||||||
    uint SubFlags;
 | 
					    uint SubFlags;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
/* optional */
 | 
					  wchar FileName[NM];
 | 
				
			||||||
  uint HighPackSize;
 | 
					
 | 
				
			||||||
  uint HighUnpSize;
 | 
					 | 
				
			||||||
/* names */
 | 
					 | 
				
			||||||
  char FileName[NM];
 | 
					 | 
				
			||||||
  wchar FileNameW[NM];
 | 
					 | 
				
			||||||
/* optional */
 | 
					 | 
				
			||||||
  Array<byte> SubData;
 | 
					  Array<byte> SubData;
 | 
				
			||||||
  byte Salt[SALT_SIZE];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  RarTime mtime;
 | 
					  RarTime mtime;
 | 
				
			||||||
  RarTime ctime;
 | 
					  RarTime ctime;
 | 
				
			||||||
  RarTime atime;
 | 
					  RarTime atime;
 | 
				
			||||||
  RarTime arctime;
 | 
					 | 
				
			||||||
/* dummy */
 | 
					 | 
				
			||||||
  int64 FullPackSize;
 | 
					 | 
				
			||||||
  int64 FullUnpSize;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void Clear(size_t SubDataSize)
 | 
					  int64 PackSize;
 | 
				
			||||||
 | 
					  int64 UnpSize;
 | 
				
			||||||
 | 
					  int64 MaxSize; // Reserve packed and unpacked size bytes for vint of this size.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HashValue FileHash;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint FileFlags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool SplitBefore;
 | 
				
			||||||
 | 
					  bool SplitAfter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool UnknownUnpSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool Encrypted;
 | 
				
			||||||
 | 
					  CRYPT_METHOD CryptMethod;
 | 
				
			||||||
 | 
					  bool SaltSet;
 | 
				
			||||||
 | 
					  byte Salt[SIZE_SALT50];
 | 
				
			||||||
 | 
					  byte InitV[SIZE_INITV];
 | 
				
			||||||
 | 
					  bool UsePswCheck;
 | 
				
			||||||
 | 
					  byte PswCheck[SIZE_PSWCHECK];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Use HMAC calculated from HashKey and checksum instead of plain checksum.
 | 
				
			||||||
 | 
					  bool UseHashKey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Key to convert checksum to HMAC. Derived from password with PBKDF2
 | 
				
			||||||
 | 
					  // using additional iterations.
 | 
				
			||||||
 | 
					  byte HashKey[SHA256_DIGEST_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint Lg2Count; // Log2 of PBKDF2 repetition count.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool Solid;
 | 
				
			||||||
 | 
					  bool Dir;
 | 
				
			||||||
 | 
					  bool CommentInHeader; // RAR 2.0 file comment.
 | 
				
			||||||
 | 
					  bool Version;   // name.ext;ver file name containing the version number.
 | 
				
			||||||
 | 
					  size_t WinSize;
 | 
				
			||||||
 | 
					  bool Inherited; // New file inherits a subblock when updating a host file (for subblocks only).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 'true' if file sizes use 8 bytes instead of 4. Not used in RAR 5.0.
 | 
				
			||||||
 | 
					  bool LargeFile;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // 'true' for HEAD_SERVICE block, which is a child of preceding file block.
 | 
				
			||||||
 | 
					  // RAR 4.x uses 'solid' flag to indicate child subheader blocks in archives.
 | 
				
			||||||
 | 
					  bool SubBlock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HOST_SYSTEM_TYPE HSType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FILE_SYSTEM_REDIRECT RedirType;
 | 
				
			||||||
 | 
					  wchar RedirName[NM];
 | 
				
			||||||
 | 
					  bool DirTarget;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool UnixOwnerSet,UnixOwnerNumeric,UnixGroupNumeric;
 | 
				
			||||||
 | 
					  char UnixOwnerName[256],UnixGroupName[256];
 | 
				
			||||||
 | 
					#ifdef _UNIX
 | 
				
			||||||
 | 
					  uid_t UnixOwnerID;
 | 
				
			||||||
 | 
					  gid_t UnixGroupID;
 | 
				
			||||||
 | 
					#else // Need these Unix fields in Windows too for 'list' command.
 | 
				
			||||||
 | 
					  uint UnixOwnerID;
 | 
				
			||||||
 | 
					  uint UnixGroupID;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Reset(size_t SubDataSize=0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool CmpName(const wchar *Name)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    SubData.Alloc(SubDataSize);
 | 
					    return(wcscmp(FileName,Name)==0);
 | 
				
			||||||
    Flags=LONG_BLOCK;
 | 
					 | 
				
			||||||
    SubFlags=0;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool CmpName(const char *Name)
 | 
					  FileHeader& operator = (FileHeader &hd);
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    return(strcmp(FileName,Name)==0);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  FileHeader& operator = (FileHeader &hd)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    SubData.Reset();
 | 
					 | 
				
			||||||
    memcpy(this,&hd,sizeof(*this));
 | 
					 | 
				
			||||||
    SubData.CleanData();
 | 
					 | 
				
			||||||
    SubData=hd.SubData;
 | 
					 | 
				
			||||||
    return(*this);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct EndArcHeader:BaseBlock
 | 
					struct EndArcHeader:BaseBlock
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  uint ArcDataCRC;  // optional archive CRC32
 | 
					  // Optional CRC32 of entire archive up to start of EndArcHeader block.
 | 
				
			||||||
  ushort VolNumber; // optional current volume number
 | 
					  // Present in RAR 4.x archives if EARC_DATACRC flag is set.
 | 
				
			||||||
 | 
					  uint ArcDataCRC;  
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  uint VolNumber; // Optional number of current volume.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 7 additional zero bytes can be stored here if EARC_REVSPACE is set.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool NextVolume; // Not last volume.
 | 
				
			||||||
 | 
					  bool DataCRC;
 | 
				
			||||||
 | 
					  bool RevSpace;
 | 
				
			||||||
 | 
					  bool StoreVolNumber;
 | 
				
			||||||
 | 
					  void Reset()
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    BaseBlock::Reset();
 | 
				
			||||||
 | 
					    NextVolume=false;
 | 
				
			||||||
 | 
					    DataCRC=false;
 | 
				
			||||||
 | 
					    RevSpace=false;
 | 
				
			||||||
 | 
					    StoreVolNumber=false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct CryptHeader:BaseBlock
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  bool UsePswCheck;
 | 
				
			||||||
 | 
					  uint Lg2Count; // Log2 of PBKDF2 repetition count.
 | 
				
			||||||
 | 
					  byte Salt[SIZE_SALT50];
 | 
				
			||||||
 | 
					  byte PswCheck[SIZE_PSWCHECK];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SubBlockHeader and its successors were used in RAR 2.x format.
 | 
					// SubBlockHeader and its successors were used in RAR 2.x format.
 | 
				
			||||||
// RAR 3.x uses FileHeader with NEWSUB_HEAD HeadType for subblocks.
 | 
					// RAR 4.x uses FileHeader with HEAD_SERVICE HeaderType for subblocks.
 | 
				
			||||||
struct SubBlockHeader:BlockHeader
 | 
					struct SubBlockHeader:BlockHeader
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ushort SubType;
 | 
					  ushort SubType;
 | 
				
			||||||
| 
						 | 
					@ -250,30 +321,13 @@ struct ProtectHeader:BlockHeader
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct AVHeader:BaseBlock
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  byte UnpVer;
 | 
					 | 
				
			||||||
  byte Method;
 | 
					 | 
				
			||||||
  byte AVVer;
 | 
					 | 
				
			||||||
  uint AVInfoCRC;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct SignHeader:BaseBlock
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  uint CreationTime;
 | 
					 | 
				
			||||||
  ushort ArcNameSize;
 | 
					 | 
				
			||||||
  ushort UserNameSize;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct UnixOwnersHeader:SubBlockHeader
 | 
					struct UnixOwnersHeader:SubBlockHeader
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ushort OwnerNameSize;
 | 
					  ushort OwnerNameSize;
 | 
				
			||||||
  ushort GroupNameSize;
 | 
					  ushort GroupNameSize;
 | 
				
			||||||
/* dummy */
 | 
					/* dummy */
 | 
				
			||||||
  char OwnerName[NM];
 | 
					  char OwnerName[256];
 | 
				
			||||||
  char GroupName[NM];
 | 
					  char GroupName[256];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -293,15 +347,7 @@ struct StreamHeader:SubBlockHeader
 | 
				
			||||||
  byte Method;
 | 
					  byte Method;
 | 
				
			||||||
  uint StreamCRC;
 | 
					  uint StreamCRC;
 | 
				
			||||||
  ushort StreamNameSize;
 | 
					  ushort StreamNameSize;
 | 
				
			||||||
/* dummy */
 | 
					  char StreamName[260];
 | 
				
			||||||
  byte StreamName[NM];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct MacFInfoHeader:SubBlockHeader
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  uint fileType;
 | 
					 | 
				
			||||||
  uint fileCreator;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,100 @@
 | 
				
			||||||
 | 
					#ifndef _RAR_HEADERS5_
 | 
				
			||||||
 | 
					#define _RAR_HEADERS5_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define  SIZEOF_MARKHEAD5        8  // RAR 5.0 signature length.
 | 
				
			||||||
 | 
					#define  SIZEOF_SHORTBLOCKHEAD5  7  // Smallest RAR 5.0 block size.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR 5.0 block flags common for all blocks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Additional extra area is present in the end of block header.
 | 
				
			||||||
 | 
					#define HFL_EXTRA           0x0001
 | 
				
			||||||
 | 
					// Additional data area is present in the end of block header.
 | 
				
			||||||
 | 
					#define HFL_DATA            0x0002
 | 
				
			||||||
 | 
					// Unknown blocks with this flag must be skipped when updating an archive.
 | 
				
			||||||
 | 
					#define HFL_SKIPIFUNKNOWN   0x0004
 | 
				
			||||||
 | 
					// Data area of this block is continuing from previous volume.
 | 
				
			||||||
 | 
					#define HFL_SPLITBEFORE     0x0008
 | 
				
			||||||
 | 
					// Data area of this block is continuing in next volume.
 | 
				
			||||||
 | 
					#define HFL_SPLITAFTER      0x0010
 | 
				
			||||||
 | 
					// Block depends on preceding file block.
 | 
				
			||||||
 | 
					#define HFL_CHILD           0x0020
 | 
				
			||||||
 | 
					// Preserve a child block if host is modified.
 | 
				
			||||||
 | 
					#define HFL_INHERITED       0x0040
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR 5.0 main archive header specific flags.
 | 
				
			||||||
 | 
					#define MHFL_VOLUME         0x0001 // Volume.
 | 
				
			||||||
 | 
					#define MHFL_VOLNUMBER      0x0002 // Volume number field is present. True for all volumes except first.
 | 
				
			||||||
 | 
					#define MHFL_SOLID          0x0004 // Solid archive.
 | 
				
			||||||
 | 
					#define MHFL_PROTECT        0x0008 // Recovery record is present.
 | 
				
			||||||
 | 
					#define MHFL_LOCK           0x0010 // Locked archive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR 5.0 file header specific flags.
 | 
				
			||||||
 | 
					#define FHFL_DIRECTORY      0x0001 // Directory.
 | 
				
			||||||
 | 
					#define FHFL_UTIME          0x0002 // Time field in Unix format is present.
 | 
				
			||||||
 | 
					#define FHFL_CRC32          0x0004 // CRC32 field is present.
 | 
				
			||||||
 | 
					#define FHFL_UNPUNKNOWN     0x0008 // Unknown unpacked size.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR 5.0 end of archive header specific flags.
 | 
				
			||||||
 | 
					#define EHFL_NEXTVOLUME     0x0001 // Not last volume.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR 5.0 archive encryption header specific flags.
 | 
				
			||||||
 | 
					#define CHFL_CRYPT_PSWCHECK 0x0001 // Password check data is present.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RAR 5.0 file compression flags.
 | 
				
			||||||
 | 
					#define FCI_ALGO_BIT0       0x0001 // Version of compression algorithm.
 | 
				
			||||||
 | 
					#define FCI_ALGO_BIT1       0x0002 // 0 .. 63.
 | 
				
			||||||
 | 
					#define FCI_ALGO_BIT2       0x0004
 | 
				
			||||||
 | 
					#define FCI_ALGO_BIT3       0x0008
 | 
				
			||||||
 | 
					#define FCI_ALGO_BIT4       0x0010
 | 
				
			||||||
 | 
					#define FCI_ALGO_BIT5       0x0020
 | 
				
			||||||
 | 
					#define FCI_SOLID           0x0040 // Solid flag.
 | 
				
			||||||
 | 
					#define FCI_METHOD_BIT0     0x0080 // Compression method.
 | 
				
			||||||
 | 
					#define FCI_METHOD_BIT1     0x0100 // 0 .. 5 (6 and 7 are not used).
 | 
				
			||||||
 | 
					#define FCI_METHOD_BIT2     0x0200
 | 
				
			||||||
 | 
					#define FCI_DICT_BIT0       0x0400 // Dictionary size.
 | 
				
			||||||
 | 
					#define FCI_DICT_BIT1       0x0800 // 128 KB .. 4 GB.
 | 
				
			||||||
 | 
					#define FCI_DICT_BIT2       0x1000
 | 
				
			||||||
 | 
					#define FCI_DICT_BIT3       0x2000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Main header extra field values.
 | 
				
			||||||
 | 
					#define MHEXTRA_LOCATOR       0x01 // Position of quick list and other blocks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Flags for MHEXTRA_LOCATOR.
 | 
				
			||||||
 | 
					#define MHEXTRA_LOCATOR_QLIST 0x01 // Quick open offset is present.
 | 
				
			||||||
 | 
					#define MHEXTRA_LOCATOR_RR    0x02 // Recovery record offset is present.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// File and service header extra field values.
 | 
				
			||||||
 | 
					#define FHEXTRA_CRYPT         0x01 // Encryption parameters.
 | 
				
			||||||
 | 
					#define FHEXTRA_HASH          0x02 // File hash.
 | 
				
			||||||
 | 
					#define FHEXTRA_HTIME         0x03 // High precision file time.
 | 
				
			||||||
 | 
					#define FHEXTRA_VERSION       0x04 // File version information.
 | 
				
			||||||
 | 
					#define FHEXTRA_REDIR         0x05 // File system redirection (links, etc.).
 | 
				
			||||||
 | 
					#define FHEXTRA_UOWNER        0x06 // Unix owner and group information.
 | 
				
			||||||
 | 
					#define FHEXTRA_SUBDATA       0x07 // Service header subdata array.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Hash type values for FHEXTRA_HASH.
 | 
				
			||||||
 | 
					#define FHEXTRA_HASH_BLAKE2    0x00
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Flags for FHEXTRA_HTIME.
 | 
				
			||||||
 | 
					#define FHEXTRA_HTIME_UNIXTIME 0x01 // Use Unix time_t format.
 | 
				
			||||||
 | 
					#define FHEXTRA_HTIME_MTIME    0x02 // mtime is present.
 | 
				
			||||||
 | 
					#define FHEXTRA_HTIME_CTIME    0x04 // ctime is present.
 | 
				
			||||||
 | 
					#define FHEXTRA_HTIME_ATIME    0x08 // atime is present.
 | 
				
			||||||
 | 
					#define FHEXTRA_HTIME_UNIX_NS  0x10 // Unix format with nanosecond precision.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Flags for FHEXTRA_CRYPT.
 | 
				
			||||||
 | 
					#define FHEXTRA_CRYPT_PSWCHECK 0x01 // Store password check data.
 | 
				
			||||||
 | 
					#define FHEXTRA_CRYPT_HASHMAC  0x02 // Use MAC for unpacked data checksums.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Flags for FHEXTRA_REDIR.
 | 
				
			||||||
 | 
					#define FHEXTRA_REDIR_DIR      0x01 // Link target is directory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Flags for FHEXTRA_UOWNER.
 | 
				
			||||||
 | 
					#define FHEXTRA_UOWNER_UNAME   0x01 // User name string is present.
 | 
				
			||||||
 | 
					#define FHEXTRA_UOWNER_GNAME   0x02 // Group name string is present.
 | 
				
			||||||
 | 
					#define FHEXTRA_UOWNER_NUMUID  0x04 // Numeric user ID is present.
 | 
				
			||||||
 | 
					#define FHEXTRA_UOWNER_NUMGID  0x08 // Numeric group ID is present.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,10 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
int WinNT()
 | 
					DWORD WinNT()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  static int dwPlatformId=-1,dwMajorVersion;
 | 
					  static int dwPlatformId=-1;
 | 
				
			||||||
 | 
					  static DWORD dwMajorVersion,dwMinorVersion;
 | 
				
			||||||
  if (dwPlatformId==-1)
 | 
					  if (dwPlatformId==-1)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    OSVERSIONINFO WinVer;
 | 
					    OSVERSIONINFO WinVer;
 | 
				
			||||||
| 
						 | 
					@ -11,7 +12,13 @@ int WinNT()
 | 
				
			||||||
    GetVersionEx(&WinVer);
 | 
					    GetVersionEx(&WinVer);
 | 
				
			||||||
    dwPlatformId=WinVer.dwPlatformId;
 | 
					    dwPlatformId=WinVer.dwPlatformId;
 | 
				
			||||||
    dwMajorVersion=WinVer.dwMajorVersion;
 | 
					    dwMajorVersion=WinVer.dwMajorVersion;
 | 
				
			||||||
 | 
					    dwMinorVersion=WinVer.dwMinorVersion;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(dwPlatformId==VER_PLATFORM_WIN32_NT ? dwMajorVersion:0);
 | 
					  DWORD Result=0;
 | 
				
			||||||
 | 
					  if (dwPlatformId==VER_PLATFORM_WIN32_NT)
 | 
				
			||||||
 | 
					    Result=dwMajorVersion*0x100+dwMinorVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return Result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,13 @@
 | 
				
			||||||
#ifndef _RAR_ISNT_
 | 
					#ifndef _RAR_ISNT_
 | 
				
			||||||
#define _RAR_ISNT_
 | 
					#define _RAR_ISNT_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int WinNT();
 | 
					enum WINNT_VERSION {
 | 
				
			||||||
 | 
					  WNT_NONE=0,WNT_NT351=0x0333,WNT_NT4=0x0400,WNT_W2000=0x0500,
 | 
				
			||||||
 | 
					  WNT_WXP=0x0501,WNT_W2003=0x0502,WNT_VISTA=0x0600,WNT_W7=0x0601,
 | 
				
			||||||
 | 
					  WNT_W8=0x0602,WNT_W81=0x0603,WNT_W10=0x0a00
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DWORD WinNT();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,551 @@
 | 
				
			||||||
 | 
					// !$*UTF8*$!
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						archiveVersion = 1;
 | 
				
			||||||
 | 
						classes = {
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						objectVersion = 50;
 | 
				
			||||||
 | 
						objects = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXFileReference section */
 | 
				
			||||||
 | 
							E296814A24BE5E1200974229 /* UnRARDll.vcxproj */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = UnRARDll.vcxproj; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296814B24BE5E1200974229 /* scantree.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = scantree.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296814C24BE5E1200974229 /* rarlang.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rarlang.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296814D24BE5E1200974229 /* threadpool.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = threadpool.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296814E24BE5E1200974229 /* unpack30.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpack30.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296814F24BE5E1200974229 /* crypt.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = crypt.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815024BE5E1200974229 /* qopen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = qopen.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815124BE5E1200974229 /* filcreat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = filcreat.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815224BE5E1200974229 /* crypt1.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = crypt1.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815324BE5E1200974229 /* filestr.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = filestr.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815424BE5E1200974229 /* suballoc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = suballoc.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815524BE5E1200974229 /* ui.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ui.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815624BE5E1200974229 /* blake2sp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = blake2sp.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815724BE5E1200974229 /* filefn.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = filefn.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815824BE5E1200974229 /* archive.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = archive.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815924BE5E1200974229 /* crypt3.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = crypt3.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815A24BE5E1200974229 /* crc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = crc.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815B24BE5E1200974229 /* strlist.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = strlist.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815C24BE5E1200974229 /* hash.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = hash.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815D24BE5E1200974229 /* headers.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = headers.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815E24BE5E1200974229 /* uicommon.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = uicommon.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296815F24BE5E1200974229 /* global.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = global.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816024BE5E1200974229 /* win32lnk.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = win32lnk.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816124BE5E1200974229 /* log.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = log.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816224BE5E1200974229 /* crypt2.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = crypt2.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816324BE5E1200974229 /* errhnd.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = errhnd.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816424BE5E1200974229 /* raros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = raros.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816524BE5E1200974229 /* acknow.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = acknow.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816624BE5E1200974229 /* strfn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = strfn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816724BE5E1200974229 /* .DS_Store */ = {isa = PBXFileReference; lastKnownFileType = file; path = .DS_Store; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816824BE5E1200974229 /* dll.rc */ = {isa = PBXFileReference; lastKnownFileType = text; path = dll.rc; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816924BE5E1200974229 /* cmddata.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = cmddata.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816A24BE5E1200974229 /* unpack50frag.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpack50frag.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816B24BE5E1200974229 /* ui.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = ui.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816C24BE5E1200974229 /* rdwrfn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rdwrfn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816D24BE5E1200974229 /* unicode.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = unicode.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816E24BE5E1200974229 /* crypt5.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = crypt5.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296816F24BE5E1200974229 /* uowners.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = uowners.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817024BE5E1200974229 /* dll.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = dll.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817124BE5E1200974229 /* extract.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = extract.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817224BE5E1200974229 /* cmdfilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = cmdfilter.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817324BE5E1200974229 /* threadpool.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = threadpool.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817424BE5E1200974229 /* unpack20.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpack20.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817524BE5E1200974229 /* compress.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = compress.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817624BE5E1200974229 /* libunrar.so */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libunrar.so; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817724BE5E1200974229 /* archive.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = archive.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817824BE5E1200974229 /* pathfn.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = pathfn.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817924BE5E1200974229 /* blake2s_sse.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = blake2s_sse.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817A24BE5E1200974229 /* loclang.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = loclang.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817B24BE5E1200974229 /* resource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = resource.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817C24BE5E1200974229 /* libunrar.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libunrar.a; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817D24BE5E1200974229 /* rarvm.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rarvm.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817E24BE5E1200974229 /* coder.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = coder.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296817F24BE5E1200974229 /* volume.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = volume.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818024BE5E1200974229 /* recvol.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = recvol.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818124BE5E1200974229 /* getbits.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = getbits.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818224BE5E1200974229 /* filefn.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = filefn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818324BE5E1200974229 /* threadmisc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = threadmisc.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818424BE5E1200974229 /* global.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = global.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818524BE5E1200974229 /* find.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = find.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818624BE5E1200974229 /* isnt.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = isnt.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818724BE5E1200974229 /* makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = makefile; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818824BE5E1200974229 /* blake2s.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = blake2s.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818924BE5E1200974229 /* array.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = array.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818A24BE5E1200974229 /* dll_nocrypt.def */ = {isa = PBXFileReference; lastKnownFileType = text; path = dll_nocrypt.def; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818B24BE5E1200974229 /* crc.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = crc.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818C24BE5E1200974229 /* consio.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = consio.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818D24BE5E1200974229 /* file.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = file.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818E24BE5E1200974229 /* encname.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = encname.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296818F24BE5E1200974229 /* find.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = find.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819024BE5E1200974229 /* timefn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = timefn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819124BE5E1200974229 /* file.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = file.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819224BE5E1200974229 /* unpack.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = unpack.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819324BE5E1200974229 /* qopen.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = qopen.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819424BE5E1200974229 /* unpack50.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpack50.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819524BE5E1200974229 /* rs.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rs.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819624BE5E1200974229 /* pathfn.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = pathfn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819724BE5E1200974229 /* sha256.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = sha256.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819824BE5E1200974229 /* arccmt.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = arccmt.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819924BE5E1200974229 /* sha256.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = sha256.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819A24BE5E1200974229 /* sha1.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = sha1.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819B24BE5E1200974229 /* rdwrfn.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = rdwrfn.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819C24BE5E1200974229 /* system.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = system.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819D24BE5E1200974229 /* rawint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rawint.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819E24BE5E1200974229 /* rawread.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rawread.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296819F24BE5E1200974229 /* list.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = list.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A024BE5E1200974229 /* match.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = match.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A124BE5E1200974229 /* filestr.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = filestr.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A224BE5E1200974229 /* strfn.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = strfn.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A324BE5E1200974229 /* rs16.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rs16.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A424BE5E1200974229 /* options.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = options.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A524BE5E1200974229 /* rijndael.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rijndael.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A624BE5E1200974229 /* dll.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = dll.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A724BE5E1200974229 /* rawread.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = rawread.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A824BE5E1200974229 /* rar.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = rar.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681A924BE5E1200974229 /* rar.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rar.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681AA24BE5E1200974229 /* extinfo.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = extinfo.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681AB24BE5E1200974229 /* model.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = model.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681AC24BE5E1200974229 /* options.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = options.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681AD24BE5E1200974229 /* blake2s.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = blake2s.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681AE24BE5E1200974229 /* headers.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = headers.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681AF24BE5E1200974229 /* dll.def */ = {isa = PBXFileReference; lastKnownFileType = text; path = dll.def; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B024BE5E1200974229 /* smallfn.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = smallfn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B124BE5E1200974229 /* getbits.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = getbits.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B224BE5E1200974229 /* timefn.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = timefn.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B324BE5E1200974229 /* secpassword.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = secpassword.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B424BE5E1200974229 /* extract.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = extract.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B524BE5E1200974229 /* filefn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = filefn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B624BE5E1200974229 /* recvol.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = recvol.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B724BE5E1200974229 /* isnt.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = isnt.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B824BE5E1200974229 /* version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = version.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681B924BE5E1200974229 /* savepos.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = savepos.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681BA24BE5E1200974229 /* unicode.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = unicode.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681BB24BE5E1200974229 /* consio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = consio.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681BC24BE5E1200974229 /* list.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = list.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681BD24BE5E1200974229 /* UnRAR.vcxproj */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = UnRAR.vcxproj; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681BE24BE5E1200974229 /* rartypes.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rartypes.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681BF24BE5E1200974229 /* crypt.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = crypt.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C024BE5E1200974229 /* encname.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = encname.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C124BE5E1200974229 /* secpassword.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = secpassword.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C224BE5E1200974229 /* uiconsole.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = uiconsole.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C324BE5E1200974229 /* file.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = file.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C424BE5E1200974229 /* timefn.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = timefn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C524BE5E1200974229 /* find.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = find.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C624BE5E1200974229 /* unpack.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpack.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C724BE5E1200974229 /* match.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = match.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C824BE5E1200974229 /* filcreat.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = filcreat.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681C924BE5E1200974229 /* rs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rs.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681CA24BE5E1200974229 /* pathfn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = pathfn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681CB24BE5E1200974229 /* arcread.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = arcread.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681CC24BE5E1200974229 /* consio.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = consio.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681CD24BE5E1200974229 /* sha1.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = sha1.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681CE24BE5E1200974229 /* sha256.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = sha256.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681CF24BE5E1200974229 /* errhnd.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = errhnd.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D024BE5E1200974229 /* rs16.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = rs16.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D124BE5E1200974229 /* unpackinline.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpackinline.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D224BE5E1200974229 /* list.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = list.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D324BE5E1200974229 /* rawread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rawread.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D424BE5E1200974229 /* match.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = match.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D524BE5E1200974229 /* system.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = system.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D624BE5E1200974229 /* hardlinks.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = hardlinks.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D724BE5E1200974229 /* options.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = options.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D824BE5E1200974229 /* rs16.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rs16.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681D924BE5E1200974229 /* rijndael.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rijndael.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681DA24BE5E1200974229 /* smallfn.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = smallfn.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681DB24BE5E1200974229 /* ulinks.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ulinks.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681DC24BE5E1200974229 /* headers5.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = headers5.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681DD24BE5E1200974229 /* resource.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = resource.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681DE24BE5E1200974229 /* blake2s.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = blake2s.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681DF24BE5E1200974229 /* extinfo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = extinfo.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E024BE5E1200974229 /* model.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = model.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E124BE5E1200974229 /* rar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rar.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E224BE5E1200974229 /* rijndael.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = rijndael.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E324BE5E1200974229 /* win32acl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = win32acl.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E424BE5E1200974229 /* getbits.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = getbits.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E524BE5E1200974229 /* rarpch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rarpch.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E624BE5E1200974229 /* secpassword.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = secpassword.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E724BE5E1200974229 /* readme.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = readme.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E824BE5E1200974229 /* smallfn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = smallfn.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681E924BE5E1200974229 /* scantree.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = scantree.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681EA24BE5E1200974229 /* sha1.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = sha1.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681EB24BE5E1200974229 /* threadpool.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = threadpool.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681EC24BE5E1200974229 /* volume.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = volume.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681ED24BE5E1200974229 /* encname.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = encname.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681EE24BE5E1200974229 /* system.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = system.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681EF24BE5E1200974229 /* filcreat.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = filcreat.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F024BE5E1200974229 /* rardefs.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rardefs.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F124BE5E1200974229 /* ui.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ui.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F224BE5E1200974229 /* suballoc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = suballoc.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F324BE5E1200974229 /* filestr.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = filestr.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F424BE5E1200974229 /* qopen.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = qopen.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F524BE5E1200974229 /* crypt.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = crypt.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F624BE5E1200974229 /* crc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = crc.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F724BE5E1200974229 /* unpack.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = unpack.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F824BE5E1200974229 /* hash.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = hash.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681F924BE5E1200974229 /* unpack50mt.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpack50mt.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681FA24BE5E1200974229 /* strlist.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = strlist.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681FB24BE5E1200974229 /* license.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = license.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681FC24BE5E1200974229 /* global.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = global.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681FD24BE5E1200974229 /* recvol3.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = recvol3.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681FE24BE5E1200974229 /* headers.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = headers.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E29681FF24BE5E1200974229 /* strlist.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = strlist.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820024BE5E1200974229 /* uisilent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = uisilent.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820124BE5E1200974229 /* log.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = log.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820224BE5E1200974229 /* cmddata.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = cmddata.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820324BE5E1200974229 /* cmdmix.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = cmdmix.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820424BE5E1200974229 /* errhnd.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = errhnd.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820524BE5E1200974229 /* os.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = os.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820624BE5E1200974229 /* rarvm.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = rarvm.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820724BE5E1200974229 /* win32stm.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = win32stm.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820824BE5E1200974229 /* scantree.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = scantree.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820924BE5E1200974229 /* strfn.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = strfn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820A24BE5E1200974229 /* cmddata.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = cmddata.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820B24BE5E1200974229 /* rdwrfn.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rdwrfn.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820C24BE5E1200974229 /* hash.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = hash.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820D24BE5E1200974229 /* extract.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = extract.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820E24BE5E1200974229 /* dll.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = dll.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296820F24BE5E1200974229 /* unicode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unicode.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821024BE5E1200974229 /* unpack15.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = unpack15.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821124BE5E1200974229 /* archive.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = archive.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821224BE5E1200974229 /* extinfo.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = extinfo.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821324BE5E1200974229 /* recvol5.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = recvol5.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821424BE5E1200974229 /* rarvm.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = rarvm.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821524BE5E1200974229 /* resource.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = resource.hpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821624BE5E1200974229 /* volume.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = volume.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821724BE5E1200974229 /* isnt.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = isnt.o; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821824BE5E1200974229 /* coder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = coder.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							E296821924BE5E1200974229 /* arcread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = arcread.cpp; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
					/* End PBXFileReference section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXGroup section */
 | 
				
			||||||
 | 
							E296814424BE5E1200974229 = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									E296814A24BE5E1200974229 /* UnRARDll.vcxproj */,
 | 
				
			||||||
 | 
									E296814B24BE5E1200974229 /* scantree.cpp */,
 | 
				
			||||||
 | 
									E296814C24BE5E1200974229 /* rarlang.hpp */,
 | 
				
			||||||
 | 
									E296814D24BE5E1200974229 /* threadpool.hpp */,
 | 
				
			||||||
 | 
									E296814E24BE5E1200974229 /* unpack30.cpp */,
 | 
				
			||||||
 | 
									E296814F24BE5E1200974229 /* crypt.cpp */,
 | 
				
			||||||
 | 
									E296815024BE5E1200974229 /* qopen.cpp */,
 | 
				
			||||||
 | 
									E296815124BE5E1200974229 /* filcreat.cpp */,
 | 
				
			||||||
 | 
									E296815224BE5E1200974229 /* crypt1.cpp */,
 | 
				
			||||||
 | 
									E296815324BE5E1200974229 /* filestr.hpp */,
 | 
				
			||||||
 | 
									E296815424BE5E1200974229 /* suballoc.hpp */,
 | 
				
			||||||
 | 
									E296815524BE5E1200974229 /* ui.cpp */,
 | 
				
			||||||
 | 
									E296815624BE5E1200974229 /* blake2sp.cpp */,
 | 
				
			||||||
 | 
									E296815724BE5E1200974229 /* filefn.o */,
 | 
				
			||||||
 | 
									E296815824BE5E1200974229 /* archive.o */,
 | 
				
			||||||
 | 
									E296815924BE5E1200974229 /* crypt3.cpp */,
 | 
				
			||||||
 | 
									E296815A24BE5E1200974229 /* crc.cpp */,
 | 
				
			||||||
 | 
									E296815B24BE5E1200974229 /* strlist.hpp */,
 | 
				
			||||||
 | 
									E296815C24BE5E1200974229 /* hash.hpp */,
 | 
				
			||||||
 | 
									E296815D24BE5E1200974229 /* headers.hpp */,
 | 
				
			||||||
 | 
									E296815E24BE5E1200974229 /* uicommon.cpp */,
 | 
				
			||||||
 | 
									E296815F24BE5E1200974229 /* global.hpp */,
 | 
				
			||||||
 | 
									E296816024BE5E1200974229 /* win32lnk.cpp */,
 | 
				
			||||||
 | 
									E296816124BE5E1200974229 /* log.cpp */,
 | 
				
			||||||
 | 
									E296816224BE5E1200974229 /* crypt2.cpp */,
 | 
				
			||||||
 | 
									E296816324BE5E1200974229 /* errhnd.cpp */,
 | 
				
			||||||
 | 
									E296816424BE5E1200974229 /* raros.hpp */,
 | 
				
			||||||
 | 
									E296816524BE5E1200974229 /* acknow.txt */,
 | 
				
			||||||
 | 
									E296816624BE5E1200974229 /* strfn.cpp */,
 | 
				
			||||||
 | 
									E296816724BE5E1200974229 /* .DS_Store */,
 | 
				
			||||||
 | 
									E296816824BE5E1200974229 /* dll.rc */,
 | 
				
			||||||
 | 
									E296816924BE5E1200974229 /* cmddata.hpp */,
 | 
				
			||||||
 | 
									E296816A24BE5E1200974229 /* unpack50frag.cpp */,
 | 
				
			||||||
 | 
									E296816B24BE5E1200974229 /* ui.o */,
 | 
				
			||||||
 | 
									E296816C24BE5E1200974229 /* rdwrfn.cpp */,
 | 
				
			||||||
 | 
									E296816D24BE5E1200974229 /* unicode.hpp */,
 | 
				
			||||||
 | 
									E296816E24BE5E1200974229 /* crypt5.cpp */,
 | 
				
			||||||
 | 
									E296816F24BE5E1200974229 /* uowners.cpp */,
 | 
				
			||||||
 | 
									E296817024BE5E1200974229 /* dll.hpp */,
 | 
				
			||||||
 | 
									E296817124BE5E1200974229 /* extract.hpp */,
 | 
				
			||||||
 | 
									E296817224BE5E1200974229 /* cmdfilter.cpp */,
 | 
				
			||||||
 | 
									E296817324BE5E1200974229 /* threadpool.o */,
 | 
				
			||||||
 | 
									E296817424BE5E1200974229 /* unpack20.cpp */,
 | 
				
			||||||
 | 
									E296817524BE5E1200974229 /* compress.hpp */,
 | 
				
			||||||
 | 
									E296817624BE5E1200974229 /* libunrar.so */,
 | 
				
			||||||
 | 
									E296817724BE5E1200974229 /* archive.hpp */,
 | 
				
			||||||
 | 
									E296817824BE5E1200974229 /* pathfn.o */,
 | 
				
			||||||
 | 
									E296817924BE5E1200974229 /* blake2s_sse.cpp */,
 | 
				
			||||||
 | 
									E296817A24BE5E1200974229 /* loclang.hpp */,
 | 
				
			||||||
 | 
									E296817B24BE5E1200974229 /* resource.cpp */,
 | 
				
			||||||
 | 
									E296817C24BE5E1200974229 /* libunrar.a */,
 | 
				
			||||||
 | 
									E296817D24BE5E1200974229 /* rarvm.cpp */,
 | 
				
			||||||
 | 
									E296817E24BE5E1200974229 /* coder.hpp */,
 | 
				
			||||||
 | 
									E296817F24BE5E1200974229 /* volume.hpp */,
 | 
				
			||||||
 | 
									E296818024BE5E1200974229 /* recvol.hpp */,
 | 
				
			||||||
 | 
									E296818124BE5E1200974229 /* getbits.o */,
 | 
				
			||||||
 | 
									E296818224BE5E1200974229 /* filefn.hpp */,
 | 
				
			||||||
 | 
									E296818324BE5E1200974229 /* threadmisc.cpp */,
 | 
				
			||||||
 | 
									E296818424BE5E1200974229 /* global.o */,
 | 
				
			||||||
 | 
									E296818524BE5E1200974229 /* find.o */,
 | 
				
			||||||
 | 
									E296818624BE5E1200974229 /* isnt.hpp */,
 | 
				
			||||||
 | 
									E296818724BE5E1200974229 /* makefile */,
 | 
				
			||||||
 | 
									E296818824BE5E1200974229 /* blake2s.o */,
 | 
				
			||||||
 | 
									E296818924BE5E1200974229 /* array.hpp */,
 | 
				
			||||||
 | 
									E296818A24BE5E1200974229 /* dll_nocrypt.def */,
 | 
				
			||||||
 | 
									E296818B24BE5E1200974229 /* crc.o */,
 | 
				
			||||||
 | 
									E296818C24BE5E1200974229 /* consio.hpp */,
 | 
				
			||||||
 | 
									E296818D24BE5E1200974229 /* file.o */,
 | 
				
			||||||
 | 
									E296818E24BE5E1200974229 /* encname.hpp */,
 | 
				
			||||||
 | 
									E296818F24BE5E1200974229 /* find.cpp */,
 | 
				
			||||||
 | 
									E296819024BE5E1200974229 /* timefn.cpp */,
 | 
				
			||||||
 | 
									E296819124BE5E1200974229 /* file.hpp */,
 | 
				
			||||||
 | 
									E296819224BE5E1200974229 /* unpack.hpp */,
 | 
				
			||||||
 | 
									E296819324BE5E1200974229 /* qopen.o */,
 | 
				
			||||||
 | 
									E296819424BE5E1200974229 /* unpack50.cpp */,
 | 
				
			||||||
 | 
									E296819524BE5E1200974229 /* rs.hpp */,
 | 
				
			||||||
 | 
									E296819624BE5E1200974229 /* pathfn.hpp */,
 | 
				
			||||||
 | 
									E296819724BE5E1200974229 /* sha256.o */,
 | 
				
			||||||
 | 
									E296819824BE5E1200974229 /* arccmt.cpp */,
 | 
				
			||||||
 | 
									E296819924BE5E1200974229 /* sha256.hpp */,
 | 
				
			||||||
 | 
									E296819A24BE5E1200974229 /* sha1.cpp */,
 | 
				
			||||||
 | 
									E296819B24BE5E1200974229 /* rdwrfn.o */,
 | 
				
			||||||
 | 
									E296819C24BE5E1200974229 /* system.hpp */,
 | 
				
			||||||
 | 
									E296819D24BE5E1200974229 /* rawint.hpp */,
 | 
				
			||||||
 | 
									E296819E24BE5E1200974229 /* rawread.hpp */,
 | 
				
			||||||
 | 
									E296819F24BE5E1200974229 /* list.hpp */,
 | 
				
			||||||
 | 
									E29681A024BE5E1200974229 /* match.cpp */,
 | 
				
			||||||
 | 
									E29681A124BE5E1200974229 /* filestr.o */,
 | 
				
			||||||
 | 
									E29681A224BE5E1200974229 /* strfn.o */,
 | 
				
			||||||
 | 
									E29681A324BE5E1200974229 /* rs16.hpp */,
 | 
				
			||||||
 | 
									E29681A424BE5E1200974229 /* options.cpp */,
 | 
				
			||||||
 | 
									E29681A524BE5E1200974229 /* rijndael.hpp */,
 | 
				
			||||||
 | 
									E29681A624BE5E1200974229 /* dll.o */,
 | 
				
			||||||
 | 
									E29681A724BE5E1200974229 /* rawread.o */,
 | 
				
			||||||
 | 
									E29681A824BE5E1200974229 /* rar.o */,
 | 
				
			||||||
 | 
									E29681A924BE5E1200974229 /* rar.hpp */,
 | 
				
			||||||
 | 
									E29681AA24BE5E1200974229 /* extinfo.hpp */,
 | 
				
			||||||
 | 
									E29681AB24BE5E1200974229 /* model.hpp */,
 | 
				
			||||||
 | 
									E29681AC24BE5E1200974229 /* options.o */,
 | 
				
			||||||
 | 
									E29681AD24BE5E1200974229 /* blake2s.cpp */,
 | 
				
			||||||
 | 
									E29681AE24BE5E1200974229 /* headers.o */,
 | 
				
			||||||
 | 
									E29681AF24BE5E1200974229 /* dll.def */,
 | 
				
			||||||
 | 
									E29681B024BE5E1200974229 /* smallfn.hpp */,
 | 
				
			||||||
 | 
									E29681B124BE5E1200974229 /* getbits.hpp */,
 | 
				
			||||||
 | 
									E29681B224BE5E1200974229 /* timefn.o */,
 | 
				
			||||||
 | 
									E29681B324BE5E1200974229 /* secpassword.hpp */,
 | 
				
			||||||
 | 
									E29681B424BE5E1200974229 /* extract.o */,
 | 
				
			||||||
 | 
									E29681B524BE5E1200974229 /* filefn.cpp */,
 | 
				
			||||||
 | 
									E29681B624BE5E1200974229 /* recvol.cpp */,
 | 
				
			||||||
 | 
									E29681B724BE5E1200974229 /* isnt.cpp */,
 | 
				
			||||||
 | 
									E29681B824BE5E1200974229 /* version.hpp */,
 | 
				
			||||||
 | 
									E29681B924BE5E1200974229 /* savepos.hpp */,
 | 
				
			||||||
 | 
									E29681BA24BE5E1200974229 /* unicode.o */,
 | 
				
			||||||
 | 
									E29681BB24BE5E1200974229 /* consio.cpp */,
 | 
				
			||||||
 | 
									E29681BC24BE5E1200974229 /* list.o */,
 | 
				
			||||||
 | 
									E29681BD24BE5E1200974229 /* UnRAR.vcxproj */,
 | 
				
			||||||
 | 
									E29681BE24BE5E1200974229 /* rartypes.hpp */,
 | 
				
			||||||
 | 
									E29681BF24BE5E1200974229 /* crypt.o */,
 | 
				
			||||||
 | 
									E29681C024BE5E1200974229 /* encname.cpp */,
 | 
				
			||||||
 | 
									E29681C124BE5E1200974229 /* secpassword.o */,
 | 
				
			||||||
 | 
									E29681C224BE5E1200974229 /* uiconsole.cpp */,
 | 
				
			||||||
 | 
									E29681C324BE5E1200974229 /* file.cpp */,
 | 
				
			||||||
 | 
									E29681C424BE5E1200974229 /* timefn.hpp */,
 | 
				
			||||||
 | 
									E29681C524BE5E1200974229 /* find.hpp */,
 | 
				
			||||||
 | 
									E29681C624BE5E1200974229 /* unpack.cpp */,
 | 
				
			||||||
 | 
									E29681C724BE5E1200974229 /* match.o */,
 | 
				
			||||||
 | 
									E29681C824BE5E1200974229 /* filcreat.o */,
 | 
				
			||||||
 | 
									E29681C924BE5E1200974229 /* rs.cpp */,
 | 
				
			||||||
 | 
									E29681CA24BE5E1200974229 /* pathfn.cpp */,
 | 
				
			||||||
 | 
									E29681CB24BE5E1200974229 /* arcread.o */,
 | 
				
			||||||
 | 
									E29681CC24BE5E1200974229 /* consio.o */,
 | 
				
			||||||
 | 
									E29681CD24BE5E1200974229 /* sha1.hpp */,
 | 
				
			||||||
 | 
									E29681CE24BE5E1200974229 /* sha256.cpp */,
 | 
				
			||||||
 | 
									E29681CF24BE5E1200974229 /* errhnd.o */,
 | 
				
			||||||
 | 
									E29681D024BE5E1200974229 /* rs16.o */,
 | 
				
			||||||
 | 
									E29681D124BE5E1200974229 /* unpackinline.cpp */,
 | 
				
			||||||
 | 
									E29681D224BE5E1200974229 /* list.cpp */,
 | 
				
			||||||
 | 
									E29681D324BE5E1200974229 /* rawread.cpp */,
 | 
				
			||||||
 | 
									E29681D424BE5E1200974229 /* match.hpp */,
 | 
				
			||||||
 | 
									E29681D524BE5E1200974229 /* system.cpp */,
 | 
				
			||||||
 | 
									E29681D624BE5E1200974229 /* hardlinks.cpp */,
 | 
				
			||||||
 | 
									E29681D724BE5E1200974229 /* options.hpp */,
 | 
				
			||||||
 | 
									E29681D824BE5E1200974229 /* rs16.cpp */,
 | 
				
			||||||
 | 
									E29681D924BE5E1200974229 /* rijndael.cpp */,
 | 
				
			||||||
 | 
									E29681DA24BE5E1200974229 /* smallfn.o */,
 | 
				
			||||||
 | 
									E29681DB24BE5E1200974229 /* ulinks.cpp */,
 | 
				
			||||||
 | 
									E29681DC24BE5E1200974229 /* headers5.hpp */,
 | 
				
			||||||
 | 
									E29681DD24BE5E1200974229 /* resource.o */,
 | 
				
			||||||
 | 
									E29681DE24BE5E1200974229 /* blake2s.hpp */,
 | 
				
			||||||
 | 
									E29681DF24BE5E1200974229 /* extinfo.cpp */,
 | 
				
			||||||
 | 
									E29681E024BE5E1200974229 /* model.cpp */,
 | 
				
			||||||
 | 
									E29681E124BE5E1200974229 /* rar.cpp */,
 | 
				
			||||||
 | 
									E29681E224BE5E1200974229 /* rijndael.o */,
 | 
				
			||||||
 | 
									E29681E324BE5E1200974229 /* win32acl.cpp */,
 | 
				
			||||||
 | 
									E29681E424BE5E1200974229 /* getbits.cpp */,
 | 
				
			||||||
 | 
									E29681E524BE5E1200974229 /* rarpch.cpp */,
 | 
				
			||||||
 | 
									E29681E624BE5E1200974229 /* secpassword.cpp */,
 | 
				
			||||||
 | 
									E29681E724BE5E1200974229 /* readme.txt */,
 | 
				
			||||||
 | 
									E29681E824BE5E1200974229 /* smallfn.cpp */,
 | 
				
			||||||
 | 
									E29681E924BE5E1200974229 /* scantree.hpp */,
 | 
				
			||||||
 | 
									E29681EA24BE5E1200974229 /* sha1.o */,
 | 
				
			||||||
 | 
									E29681EB24BE5E1200974229 /* threadpool.cpp */,
 | 
				
			||||||
 | 
									E29681EC24BE5E1200974229 /* volume.o */,
 | 
				
			||||||
 | 
									E29681ED24BE5E1200974229 /* encname.o */,
 | 
				
			||||||
 | 
									E29681EE24BE5E1200974229 /* system.o */,
 | 
				
			||||||
 | 
									E29681EF24BE5E1200974229 /* filcreat.hpp */,
 | 
				
			||||||
 | 
									E29681F024BE5E1200974229 /* rardefs.hpp */,
 | 
				
			||||||
 | 
									E29681F124BE5E1200974229 /* ui.hpp */,
 | 
				
			||||||
 | 
									E29681F224BE5E1200974229 /* suballoc.cpp */,
 | 
				
			||||||
 | 
									E29681F324BE5E1200974229 /* filestr.cpp */,
 | 
				
			||||||
 | 
									E29681F424BE5E1200974229 /* qopen.hpp */,
 | 
				
			||||||
 | 
									E29681F524BE5E1200974229 /* crypt.hpp */,
 | 
				
			||||||
 | 
									E29681F624BE5E1200974229 /* crc.hpp */,
 | 
				
			||||||
 | 
									E29681F724BE5E1200974229 /* unpack.o */,
 | 
				
			||||||
 | 
									E29681F824BE5E1200974229 /* hash.cpp */,
 | 
				
			||||||
 | 
									E29681F924BE5E1200974229 /* unpack50mt.cpp */,
 | 
				
			||||||
 | 
									E29681FA24BE5E1200974229 /* strlist.cpp */,
 | 
				
			||||||
 | 
									E29681FB24BE5E1200974229 /* license.txt */,
 | 
				
			||||||
 | 
									E29681FC24BE5E1200974229 /* global.cpp */,
 | 
				
			||||||
 | 
									E29681FD24BE5E1200974229 /* recvol3.cpp */,
 | 
				
			||||||
 | 
									E29681FE24BE5E1200974229 /* headers.cpp */,
 | 
				
			||||||
 | 
									E29681FF24BE5E1200974229 /* strlist.o */,
 | 
				
			||||||
 | 
									E296820024BE5E1200974229 /* uisilent.cpp */,
 | 
				
			||||||
 | 
									E296820124BE5E1200974229 /* log.hpp */,
 | 
				
			||||||
 | 
									E296820224BE5E1200974229 /* cmddata.o */,
 | 
				
			||||||
 | 
									E296820324BE5E1200974229 /* cmdmix.cpp */,
 | 
				
			||||||
 | 
									E296820424BE5E1200974229 /* errhnd.hpp */,
 | 
				
			||||||
 | 
									E296820524BE5E1200974229 /* os.hpp */,
 | 
				
			||||||
 | 
									E296820624BE5E1200974229 /* rarvm.o */,
 | 
				
			||||||
 | 
									E296820724BE5E1200974229 /* win32stm.cpp */,
 | 
				
			||||||
 | 
									E296820824BE5E1200974229 /* scantree.o */,
 | 
				
			||||||
 | 
									E296820924BE5E1200974229 /* strfn.hpp */,
 | 
				
			||||||
 | 
									E296820A24BE5E1200974229 /* cmddata.cpp */,
 | 
				
			||||||
 | 
									E296820B24BE5E1200974229 /* rdwrfn.hpp */,
 | 
				
			||||||
 | 
									E296820C24BE5E1200974229 /* hash.o */,
 | 
				
			||||||
 | 
									E296820D24BE5E1200974229 /* extract.cpp */,
 | 
				
			||||||
 | 
									E296820E24BE5E1200974229 /* dll.cpp */,
 | 
				
			||||||
 | 
									E296820F24BE5E1200974229 /* unicode.cpp */,
 | 
				
			||||||
 | 
									E296821024BE5E1200974229 /* unpack15.cpp */,
 | 
				
			||||||
 | 
									E296821124BE5E1200974229 /* archive.cpp */,
 | 
				
			||||||
 | 
									E296821224BE5E1200974229 /* extinfo.o */,
 | 
				
			||||||
 | 
									E296821324BE5E1200974229 /* recvol5.cpp */,
 | 
				
			||||||
 | 
									E296821424BE5E1200974229 /* rarvm.hpp */,
 | 
				
			||||||
 | 
									E296821524BE5E1200974229 /* resource.hpp */,
 | 
				
			||||||
 | 
									E296821624BE5E1200974229 /* volume.cpp */,
 | 
				
			||||||
 | 
									E296821724BE5E1200974229 /* isnt.o */,
 | 
				
			||||||
 | 
									E296821824BE5E1200974229 /* coder.cpp */,
 | 
				
			||||||
 | 
									E296821924BE5E1200974229 /* arcread.cpp */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXGroup section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXLegacyTarget section */
 | 
				
			||||||
 | 
							E296814924BE5E1200974229 /* libunrar */ = {
 | 
				
			||||||
 | 
								isa = PBXLegacyTarget;
 | 
				
			||||||
 | 
								buildArgumentsString = "$(ACTION)";
 | 
				
			||||||
 | 
								buildConfigurationList = E296821A24BE5E1200974229 /* Build configuration list for PBXLegacyTarget "libunrar" */;
 | 
				
			||||||
 | 
								buildPhases = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								buildToolPath = /usr/bin/make;
 | 
				
			||||||
 | 
								buildWorkingDirectory = /Users/tarasis/Programming/Projects/QuietUnrar/libunrar;
 | 
				
			||||||
 | 
								dependencies = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = libunrar;
 | 
				
			||||||
 | 
								passBuildSettingsInEnvironment = 1;
 | 
				
			||||||
 | 
								productName = libunrar;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXLegacyTarget section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXProject section */
 | 
				
			||||||
 | 
							E296814524BE5E1200974229 /* Project object */ = {
 | 
				
			||||||
 | 
								isa = PBXProject;
 | 
				
			||||||
 | 
								attributes = {
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								buildConfigurationList = E296814824BE5E1200974229 /* Build configuration list for PBXProject "libunrar" */;
 | 
				
			||||||
 | 
								compatibilityVersion = "Xcode 9.3";
 | 
				
			||||||
 | 
								developmentRegion = en;
 | 
				
			||||||
 | 
								hasScannedForEncodings = 0;
 | 
				
			||||||
 | 
								knownRegions = (
 | 
				
			||||||
 | 
									en,
 | 
				
			||||||
 | 
									Base,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								mainGroup = E296814424BE5E1200974229;
 | 
				
			||||||
 | 
								projectDirPath = "";
 | 
				
			||||||
 | 
								projectRoot = "";
 | 
				
			||||||
 | 
								targets = (
 | 
				
			||||||
 | 
									E296814924BE5E1200974229 /* libunrar */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXProject section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin XCBuildConfiguration section */
 | 
				
			||||||
 | 
							E296814624BE5E1200974229 /* Debug */ = {
 | 
				
			||||||
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 | 
				
			||||||
 | 
									COPY_PHASE_STRIP = NO;
 | 
				
			||||||
 | 
									GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNUSED_VARIABLE = YES;
 | 
				
			||||||
 | 
									ONLY_ACTIVE_ARCH = YES;
 | 
				
			||||||
 | 
									SDKROOT = macosx10.6;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								name = Debug;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							E296814724BE5E1200974229 /* Release */ = {
 | 
				
			||||||
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 | 
				
			||||||
 | 
									COPY_PHASE_STRIP = YES;
 | 
				
			||||||
 | 
									GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNUSED_VARIABLE = YES;
 | 
				
			||||||
 | 
									SDKROOT = macosx10.6;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								name = Release;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							E296821B24BE5E1200974229 /* Debug */ = {
 | 
				
			||||||
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									COPY_PHASE_STRIP = NO;
 | 
				
			||||||
 | 
									DEBUGGING_SYMBOLS = YES;
 | 
				
			||||||
 | 
									GCC_DYNAMIC_NO_PIC = NO;
 | 
				
			||||||
 | 
									GCC_ENABLE_FIX_AND_CONTINUE = YES;
 | 
				
			||||||
 | 
									GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 | 
				
			||||||
 | 
									GCC_OPTIMIZATION_LEVEL = 0;
 | 
				
			||||||
 | 
									OTHER_CFLAGS = "";
 | 
				
			||||||
 | 
									OTHER_LDFLAGS = "";
 | 
				
			||||||
 | 
									PRODUCT_NAME = libunrar;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								name = Debug;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							E296821C24BE5E1200974229 /* Release */ = {
 | 
				
			||||||
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									COPY_PHASE_STRIP = YES;
 | 
				
			||||||
 | 
									DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 | 
				
			||||||
 | 
									GCC_ENABLE_FIX_AND_CONTINUE = NO;
 | 
				
			||||||
 | 
									OTHER_CFLAGS = "";
 | 
				
			||||||
 | 
									OTHER_LDFLAGS = "";
 | 
				
			||||||
 | 
									PRODUCT_NAME = libunrar;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								name = Release;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End XCBuildConfiguration section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin XCConfigurationList section */
 | 
				
			||||||
 | 
							E296814824BE5E1200974229 /* Build configuration list for PBXProject "libunrar" */ = {
 | 
				
			||||||
 | 
								isa = XCConfigurationList;
 | 
				
			||||||
 | 
								buildConfigurations = (
 | 
				
			||||||
 | 
									E296814624BE5E1200974229 /* Debug */,
 | 
				
			||||||
 | 
									E296814724BE5E1200974229 /* Release */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								defaultConfigurationIsVisible = 0;
 | 
				
			||||||
 | 
								defaultConfigurationName = Release;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							E296821A24BE5E1200974229 /* Build configuration list for PBXLegacyTarget "libunrar" */ = {
 | 
				
			||||||
 | 
								isa = XCConfigurationList;
 | 
				
			||||||
 | 
								buildConfigurations = (
 | 
				
			||||||
 | 
									E296821B24BE5E1200974229 /* Debug */,
 | 
				
			||||||
 | 
									E296821C24BE5E1200974229 /* Release */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								defaultConfigurationIsVisible = 0;
 | 
				
			||||||
 | 
								defaultConfigurationName = Release;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End XCConfigurationList section */
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						rootObject = E296814524BE5E1200974229 /* Project object */;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -10,13 +10,15 @@
 | 
				
			||||||
   1. All copyrights to RAR and the utility UnRAR are exclusively
 | 
					   1. All copyrights to RAR and the utility UnRAR are exclusively
 | 
				
			||||||
      owned by the author - Alexander Roshal.
 | 
					      owned by the author - Alexander Roshal.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   2. The UnRAR sources may be used in any software to handle RAR
 | 
					   2. UnRAR source code may be used in any software to handle
 | 
				
			||||||
      archives without limitations free of charge, but cannot be used
 | 
					      RAR archives without limitations free of charge, but cannot be
 | 
				
			||||||
      to re-create the RAR compression algorithm, which is proprietary.
 | 
					      used to develop RAR (WinRAR) compatible archiver and to
 | 
				
			||||||
      Distribution of modified UnRAR sources in separate form or as a
 | 
					      re-create RAR compression algorithm, which is proprietary.
 | 
				
			||||||
      part of other software is permitted, provided that it is clearly
 | 
					      Distribution of modified UnRAR source code in separate form
 | 
				
			||||||
      stated in the documentation and source comments that the code may
 | 
					      or as a part of other software is permitted, provided that
 | 
				
			||||||
      not be used to develop a RAR (WinRAR) compatible archiver.
 | 
					      full text of this paragraph, starting from "UnRAR source code"
 | 
				
			||||||
 | 
					      words, is included in license, or in documentation if license
 | 
				
			||||||
 | 
					      is not available, and in source code comments of resulting package.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   3. The UnRAR utility may be freely distributed. It is allowed
 | 
					   3. The UnRAR utility may be freely distributed. It is allowed
 | 
				
			||||||
      to distribute UnRAR inside of other software packages.
 | 
					      to distribute UnRAR inside of other software packages.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,29 +1,31 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ListFileHeader(FileHeader &hd,bool Verbose,bool Technical,bool &TitleShown,bool Bare);
 | 
					static void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare);
 | 
				
			||||||
static void ListSymLink(Archive &Arc);
 | 
					static void ListSymLink(Archive &Arc);
 | 
				
			||||||
static void ListFileAttr(uint A,int HostOS);
 | 
					static void ListFileAttr(uint A,HOST_SYSTEM_TYPE HostType,wchar *AttrStr,size_t AttrSize);
 | 
				
			||||||
static void ListOldSubHeader(Archive &Arc);
 | 
					static void ListOldSubHeader(Archive &Arc);
 | 
				
			||||||
static void ListNewSubHeader(CommandData *Cmd,Archive &Arc,bool Technical);
 | 
					static void ListNewSubHeader(CommandData *Cmd,Archive &Arc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ListArchive(CommandData *Cmd)
 | 
					void ListArchive(CommandData *Cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int64 SumPackSize=0,SumUnpSize=0;
 | 
					  int64 SumPackSize=0,SumUnpSize=0;
 | 
				
			||||||
  uint ArcCount=0,SumFileCount=0;
 | 
					  uint ArcCount=0,SumFileCount=0;
 | 
				
			||||||
  bool Technical=(Cmd->Command[1]=='T');
 | 
					  bool Technical=(Cmd->Command[1]=='T');
 | 
				
			||||||
 | 
					  bool ShowService=Technical && Cmd->Command[2]=='A';
 | 
				
			||||||
  bool Bare=(Cmd->Command[1]=='B');
 | 
					  bool Bare=(Cmd->Command[1]=='B');
 | 
				
			||||||
  bool Verbose=(*Cmd->Command=='V');
 | 
					  bool Verbose=(Cmd->Command[0]=='V');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char ArcName[NM];
 | 
					  wchar ArcName[NM];
 | 
				
			||||||
  wchar ArcNameW[NM];
 | 
					  while (Cmd->GetArcName(ArcName,ASIZE(ArcName)))
 | 
				
			||||||
 | 
					 | 
				
			||||||
  while (Cmd->GetArcName(ArcName,ArcNameW,sizeof(ArcName)))
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    if (Cmd->ManualPassword)
 | 
				
			||||||
 | 
					      Cmd->Password.Clean(); // Clean user entered password before processing next archive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Archive Arc(Cmd);
 | 
					    Archive Arc(Cmd);
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
    Arc.RemoveSequentialFlag();
 | 
					    Arc.RemoveSequentialFlag();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    if (!Arc.WOpen(ArcName,ArcNameW))
 | 
					    if (!Arc.WOpen(ArcName))
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    bool FileMatched=true;
 | 
					    bool FileMatched=true;
 | 
				
			||||||
    while (1)
 | 
					    while (1)
 | 
				
			||||||
| 
						 | 
					@ -32,110 +34,112 @@ void ListArchive(CommandData *Cmd)
 | 
				
			||||||
      uint FileCount=0;
 | 
					      uint FileCount=0;
 | 
				
			||||||
      if (Arc.IsArchive(true))
 | 
					      if (Arc.IsArchive(true))
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        if (!Arc.IsOpened())
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
        bool TitleShown=false;
 | 
					        bool TitleShown=false;
 | 
				
			||||||
        if (!Bare)
 | 
					        if (!Bare)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          Arc.ViewComment();
 | 
					          Arc.ViewComment();
 | 
				
			||||||
 | 
					          mprintf(L"\n%s: %s",St(MListArchive),Arc.FileName);
 | 
				
			||||||
          // RAR can close a corrupt encrypted archive
 | 
					          mprintf(L"\n%s: ",St(MListDetails));
 | 
				
			||||||
          if (!Arc.IsOpened())
 | 
					          uint SetCount=0;
 | 
				
			||||||
            break;
 | 
					          const wchar *Fmt=Arc.Format==RARFMT14 ? L"RAR 1.4":(Arc.Format==RARFMT15 ? L"RAR 4":L"RAR 5");
 | 
				
			||||||
 | 
					          mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", Fmt);
 | 
				
			||||||
          mprintf("\n");
 | 
					 | 
				
			||||||
          if (Arc.Solid)
 | 
					          if (Arc.Solid)
 | 
				
			||||||
            mprintf(St(MListSolid));
 | 
					            mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListSolid));
 | 
				
			||||||
          if (Arc.SFXSize>0)
 | 
					          if (Arc.SFXSize>0)
 | 
				
			||||||
            mprintf(St(MListSFX));
 | 
					            mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListSFX));
 | 
				
			||||||
          if (Arc.Volume)
 | 
					          if (Arc.Volume)
 | 
				
			||||||
            if (Arc.Solid)
 | 
					            if (Arc.Format==RARFMT50)
 | 
				
			||||||
              mprintf(St(MListVol1));
 | 
					            {
 | 
				
			||||||
 | 
					              // RAR 5.0 archives store the volume number in main header,
 | 
				
			||||||
 | 
					              // so it is already available now.
 | 
				
			||||||
 | 
					              if (SetCount++ > 0)
 | 
				
			||||||
 | 
					                mprintf(L", ");
 | 
				
			||||||
 | 
					              mprintf(St(MVolumeNumber),Arc.VolNumber+1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
              mprintf(St(MListVol2));
 | 
					              mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListVolume));
 | 
				
			||||||
          else
 | 
					          if (Arc.Protected)
 | 
				
			||||||
            if (Arc.Solid)
 | 
					            mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListRR));
 | 
				
			||||||
              mprintf(St(MListArc1));
 | 
					          if (Arc.Locked)
 | 
				
			||||||
            else
 | 
					            mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListLock));
 | 
				
			||||||
              mprintf(St(MListArc2));
 | 
					          if (Arc.Encrypted)
 | 
				
			||||||
          mprintf(" %s\n",Arc.FileName);
 | 
					            mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListEncHead));
 | 
				
			||||||
          if (Technical)
 | 
					          mprintf(L"\n");
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            if (Arc.Protected)
 | 
					 | 
				
			||||||
              mprintf(St(MListRecRec));
 | 
					 | 
				
			||||||
            if (Arc.Locked)
 | 
					 | 
				
			||||||
              mprintf(St(MListLock));
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        wchar VolNumText[50];
 | 
				
			||||||
 | 
					        *VolNumText=0;
 | 
				
			||||||
        while(Arc.ReadHeader()>0)
 | 
					        while(Arc.ReadHeader()>0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          int HeaderType=Arc.GetHeaderType();
 | 
					          Wait(); // Allow quit listing with Ctrl+C.
 | 
				
			||||||
          if (HeaderType==ENDARC_HEAD)
 | 
					          HEADER_TYPE HeaderType=Arc.GetHeaderType();
 | 
				
			||||||
 | 
					          if (HeaderType==HEAD_ENDARC)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					            // Only RAR 1.5 archives store the volume number in end record.
 | 
				
			||||||
 | 
					            if (Arc.EndArcHead.StoreVolNumber && Arc.Format==RARFMT15)
 | 
				
			||||||
 | 
					              swprintf(VolNumText,ASIZE(VolNumText),L"%.10ls %u",St(MListVolume),Arc.VolNumber+1);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					            if (Technical && ShowService)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              mprintf(L"\n%12ls: %ls",St(MListService),L"EOF");
 | 
				
			||||||
 | 
					              if (*VolNumText!=0)
 | 
				
			||||||
 | 
					                mprintf(L"\n%12ls: %ls",St(MListFlags),VolNumText);
 | 
				
			||||||
 | 
					              mprintf(L"\n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
          switch(HeaderType)
 | 
					          switch(HeaderType)
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            case FILE_HEAD:
 | 
					            case HEAD_FILE:
 | 
				
			||||||
              IntToExt(Arc.NewLhd.FileName,Arc.NewLhd.FileName);
 | 
					              FileMatched=Cmd->IsProcessFile(Arc.FileHead,NULL,MATCH_WILDSUBPATH,0,NULL,0)!=0;
 | 
				
			||||||
              FileMatched=Cmd->IsProcessFile(Arc.NewLhd)!=0;
 | 
					              if (FileMatched)
 | 
				
			||||||
			  if (FileMatched)
 | 
					 | 
				
			||||||
              {
 | 
					              {
 | 
				
			||||||
                ListFileHeader(Arc.NewLhd,Verbose,Technical,TitleShown,Bare);
 | 
					                ListFileHeader(Arc,Arc.FileHead,TitleShown,Verbose,Technical,Bare);
 | 
				
			||||||
                if (!(Arc.NewLhd.Flags & LHD_SPLIT_BEFORE))
 | 
					                if (!Arc.FileHead.SplitBefore)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                  TotalUnpSize+=Arc.NewLhd.FullUnpSize;
 | 
					                  TotalUnpSize+=Arc.FileHead.UnpSize;
 | 
				
			||||||
                  FileCount++;
 | 
					                  FileCount++;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                TotalPackSize+=Arc.NewLhd.FullPackSize;
 | 
					                TotalPackSize+=Arc.FileHead.PackSize;
 | 
				
			||||||
                if (Technical)
 | 
					 | 
				
			||||||
                  ListSymLink(Arc);
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
                if (Verbose)
 | 
					 | 
				
			||||||
                  Arc.ViewFileComment();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					            case HEAD_SERVICE:
 | 
				
			||||||
            case SUB_HEAD:
 | 
					 | 
				
			||||||
              if (Technical && FileMatched && !Bare)
 | 
					 | 
				
			||||||
                ListOldSubHeader(Arc);
 | 
					 | 
				
			||||||
              break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            case NEWSUB_HEAD:
 | 
					 | 
				
			||||||
              if (FileMatched && !Bare)
 | 
					              if (FileMatched && !Bare)
 | 
				
			||||||
              {
 | 
					              {
 | 
				
			||||||
                if (Technical)
 | 
					                if (Technical && ShowService)
 | 
				
			||||||
                  ListFileHeader(Arc.SubHead,Verbose,true,TitleShown,false);
 | 
					                  ListFileHeader(Arc,Arc.SubHead,TitleShown,Verbose,true,false);
 | 
				
			||||||
                ListNewSubHeader(Cmd,Arc,Technical);
 | 
					 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          Arc.SeekToNext();
 | 
					          Arc.SeekToNext();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!Bare)
 | 
					        if (!Bare && !Technical)
 | 
				
			||||||
          if (TitleShown)
 | 
					          if (TitleShown)
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            mprintf("\n");
 | 
					            wchar UnpSizeText[20];
 | 
				
			||||||
            for (int I=0;I<79;I++)
 | 
					            itoa(TotalUnpSize,UnpSizeText,ASIZE(UnpSizeText));
 | 
				
			||||||
              mprintf("-");
 | 
					 | 
				
			||||||
            char UnpSizeText[20];
 | 
					 | 
				
			||||||
            itoa(TotalUnpSize,UnpSizeText);
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            char PackSizeText[20];
 | 
					            wchar PackSizeText[20];
 | 
				
			||||||
            itoa(TotalPackSize,PackSizeText);
 | 
					            itoa(TotalPackSize,PackSizeText,ASIZE(PackSizeText));
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            if (Verbose)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              mprintf(L"\n----------- ---------  -------- ----- ---------- -----  --------  ----");
 | 
				
			||||||
 | 
					              mprintf(L"\n%21ls %9ls %3d%%  %-27ls %u",UnpSizeText,
 | 
				
			||||||
 | 
					                      PackSizeText,ToPercentUnlim(TotalPackSize,TotalUnpSize),
 | 
				
			||||||
 | 
					                      VolNumText,FileCount);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              mprintf(L"\n----------- ---------  ---------- -----  ----");
 | 
				
			||||||
 | 
					              mprintf(L"\n%21ls  %-16ls  %u",UnpSizeText,VolNumText,FileCount);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            mprintf("\n%5lu %16s %8s %3d%%",FileCount,UnpSizeText,
 | 
					 | 
				
			||||||
                    PackSizeText,ToPercentUnlim(TotalPackSize,TotalUnpSize));
 | 
					 | 
				
			||||||
            SumFileCount+=FileCount;
 | 
					            SumFileCount+=FileCount;
 | 
				
			||||||
            SumUnpSize+=TotalUnpSize;
 | 
					            SumUnpSize+=TotalUnpSize;
 | 
				
			||||||
            SumPackSize+=TotalPackSize;
 | 
					            SumPackSize+=TotalPackSize;
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					            mprintf(L"\n");
 | 
				
			||||||
            if (Arc.EndArcHead.Flags & EARC_VOLNUMBER)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              mprintf("       ");
 | 
					 | 
				
			||||||
              mprintf(St(MVolumeNumber),Arc.EndArcHead.VolNumber+1);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            mprintf("\n");
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
            mprintf(St(MListNoFiles));
 | 
					            mprintf(St(MListNoFiles));
 | 
				
			||||||
| 
						 | 
					@ -143,254 +147,328 @@ void ListArchive(CommandData *Cmd)
 | 
				
			||||||
        ArcCount++;
 | 
					        ArcCount++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef NOVOLUME
 | 
					#ifndef NOVOLUME
 | 
				
			||||||
        if (Cmd->VolSize!=0 && ((Arc.NewLhd.Flags & LHD_SPLIT_AFTER) ||
 | 
					        if (Cmd->VolSize!=0 && (Arc.FileHead.SplitAfter ||
 | 
				
			||||||
            Arc.GetHeaderType()==ENDARC_HEAD &&
 | 
					            Arc.GetHeaderType()==HEAD_ENDARC && Arc.EndArcHead.NextVolume) &&
 | 
				
			||||||
            (Arc.EndArcHead.Flags & EARC_NEXT_VOLUME)!=0) &&
 | 
					            MergeArchive(Arc,NULL,false,Cmd->Command[0]))
 | 
				
			||||||
            MergeArchive(Arc,NULL,false,*Cmd->Command))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          Arc.Seek(0,SEEK_SET);
 | 
					          Arc.Seek(0,SEEK_SET);
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        if (Cmd->ArcNames->ItemsCount()<2 && !Bare)
 | 
					        if (Cmd->ArcNames.ItemsCount()<2 && !Bare)
 | 
				
			||||||
          mprintf(St(MNotRAR),Arc.FileName);
 | 
					          mprintf(St(MNotRAR),Arc.FileName);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (ArcCount>1 && !Bare)
 | 
					
 | 
				
			||||||
 | 
					  // Clean user entered password. Not really required, just for extra safety.
 | 
				
			||||||
 | 
					  if (Cmd->ManualPassword)
 | 
				
			||||||
 | 
					    Cmd->Password.Clean();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (ArcCount>1 && !Bare && !Technical)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    char UnpSizeText[20],PackSizeText[20];
 | 
					    wchar UnpSizeText[20],PackSizeText[20];
 | 
				
			||||||
    itoa(SumUnpSize,UnpSizeText);
 | 
					    itoa(SumUnpSize,UnpSizeText,ASIZE(UnpSizeText));
 | 
				
			||||||
    itoa(SumPackSize,PackSizeText);
 | 
					    itoa(SumPackSize,PackSizeText,ASIZE(PackSizeText));
 | 
				
			||||||
    mprintf("\n%5lu %16s %8s %3d%%\n",SumFileCount,UnpSizeText,
 | 
					
 | 
				
			||||||
            PackSizeText,ToPercentUnlim(SumPackSize,SumUnpSize));
 | 
					    if (Verbose)
 | 
				
			||||||
 | 
					      mprintf(L"%21ls %9ls %3d%% %28ls %u",UnpSizeText,PackSizeText,
 | 
				
			||||||
 | 
					              ToPercentUnlim(SumPackSize,SumUnpSize),L"",SumFileCount);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      mprintf(L"%21ls %18s %lu",UnpSizeText,L"",SumFileCount);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ListFileHeader(FileHeader &hd,bool Verbose,bool Technical,bool &TitleShown,bool Bare)
 | 
					enum LISTCOL_TYPE {
 | 
				
			||||||
 | 
					  LCOL_NAME,LCOL_ATTR,LCOL_SIZE,LCOL_PACKED,LCOL_RATIO,LCOL_CSUM,LCOL_ENCR
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (!Bare)
 | 
					  wchar *Name=hd.FileName;
 | 
				
			||||||
  {
 | 
					  RARFORMAT Format=Arc.Format;
 | 
				
			||||||
    if (!TitleShown)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      if (Verbose)
 | 
					 | 
				
			||||||
        mprintf(St(MListPathComm));
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        mprintf(St(MListName));
 | 
					 | 
				
			||||||
      mprintf(St(MListTitle));
 | 
					 | 
				
			||||||
      if (Technical)
 | 
					 | 
				
			||||||
        mprintf(St(MListTechTitle));
 | 
					 | 
				
			||||||
      for (int I=0;I<79;I++)
 | 
					 | 
				
			||||||
        mprintf("-");
 | 
					 | 
				
			||||||
      TitleShown=true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (hd.HeadType==NEWSUB_HEAD)
 | 
					 | 
				
			||||||
      mprintf(St(MSubHeadType),hd.FileName);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    mprintf("\n%c",(hd.Flags & LHD_PASSWORD) ? '*' : ' ');
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  char *Name=hd.FileName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef UNICODE_SUPPORTED
 | 
					 | 
				
			||||||
  char ConvertedName[NM];
 | 
					 | 
				
			||||||
  if ((hd.Flags & LHD_UNICODE)!=0 && *hd.FileNameW!=0 && UnicodeEnabled())
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (WideToChar(hd.FileNameW,ConvertedName) && *ConvertedName!=0)
 | 
					 | 
				
			||||||
      Name=ConvertedName;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Bare)
 | 
					  if (Bare)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    mprintf("%s\n",Verbose ? Name:PointToName(Name));
 | 
					    mprintf(L"%s\n",Name);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Verbose)
 | 
					  if (!TitleShown && !Technical)
 | 
				
			||||||
    mprintf("%s\n%12s ",Name,"");
 | 
					  {
 | 
				
			||||||
  else
 | 
					    if (Verbose)
 | 
				
			||||||
    mprintf("%-12s",PointToName(Name));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  char UnpSizeText[20],PackSizeText[20];
 | 
					 | 
				
			||||||
  if (hd.FullUnpSize==INT64NDF)
 | 
					 | 
				
			||||||
    strcpy(UnpSizeText,"?");
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    itoa(hd.FullUnpSize,UnpSizeText);
 | 
					 | 
				
			||||||
  itoa(hd.FullPackSize,PackSizeText);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  mprintf(" %8s %8s ",UnpSizeText,PackSizeText);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if ((hd.Flags & LHD_SPLIT_BEFORE) && (hd.Flags & LHD_SPLIT_AFTER))
 | 
					 | 
				
			||||||
    mprintf(" <->");
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    if (hd.Flags & LHD_SPLIT_BEFORE)
 | 
					 | 
				
			||||||
      mprintf(" <--");
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      if (hd.Flags & LHD_SPLIT_AFTER)
 | 
					 | 
				
			||||||
        mprintf(" -->");
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        mprintf("%3d%%",ToPercentUnlim(hd.FullPackSize,hd.FullUnpSize));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  char DateStr[50];
 | 
					 | 
				
			||||||
  hd.mtime.GetText(DateStr,false);
 | 
					 | 
				
			||||||
  mprintf(" %s ",DateStr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (hd.HeadType==NEWSUB_HEAD)
 | 
					 | 
				
			||||||
    mprintf("  %c....B  ",(hd.SubFlags & SUBHEAD_FLAGS_INHERITED) ? 'I' : '.');
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    ListFileAttr(hd.FileAttr,hd.HostOS);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  mprintf(" %8.8X",hd.FileCRC);
 | 
					 | 
				
			||||||
  mprintf(" m%d",hd.Method-0x30);
 | 
					 | 
				
			||||||
  if ((hd.Flags & LHD_WINDOWMASK)<=6*32)
 | 
					 | 
				
			||||||
    mprintf("%c",((hd.Flags&LHD_WINDOWMASK)>>5)+'a');
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    mprintf(" ");
 | 
					 | 
				
			||||||
  mprintf(" %d.%d",hd.UnpVer/10,hd.UnpVer%10);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static const char *RarOS[]={
 | 
					 | 
				
			||||||
    "DOS","OS/2","Win95/NT","Unix","MacOS","BeOS","WinCE","","",""
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Technical)
 | 
					 | 
				
			||||||
    mprintf("\n%22s %8s %4s",
 | 
					 | 
				
			||||||
            (hd.HostOS<sizeof(RarOS)/sizeof(RarOS[0]) ? RarOS[hd.HostOS]:""),
 | 
					 | 
				
			||||||
            (hd.Flags & LHD_SOLID) ? St(MYes):St(MNo),
 | 
					 | 
				
			||||||
            (hd.Flags & LHD_VERSION) ? St(MYes):St(MNo));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ListSymLink(Archive &Arc)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (Arc.NewLhd.HostOS==HOST_UNIX && (Arc.NewLhd.FileAttr & 0xF000)==0xA000)
 | 
					 | 
				
			||||||
    if ((Arc.NewLhd.Flags & LHD_PASSWORD)==0)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      char FileName[NM];
 | 
					      mprintf(L"\n%ls",St(MListTitleV));
 | 
				
			||||||
      int DataSize=Min(Arc.NewLhd.PackSize,sizeof(FileName)-1);
 | 
					      mprintf(L"\n----------- ---------  -------- ----- ---------- -----  --------  ----");
 | 
				
			||||||
      Arc.Read(FileName,DataSize);
 | 
					 | 
				
			||||||
      FileName[DataSize]=0;
 | 
					 | 
				
			||||||
      mprintf("\n%22s %s","-->",FileName);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      mprintf(L"\n%ls",St(MListTitleL));
 | 
				
			||||||
 | 
					      mprintf(L"\n----------- ---------  ---------- -----  ----");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    TitleShown=true;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wchar UnpSizeText[30],PackSizeText[30];
 | 
				
			||||||
 | 
					  if (hd.UnpSize==INT64NDF)
 | 
				
			||||||
 | 
					    wcsncpyz(UnpSizeText,L"?",ASIZE(UnpSizeText));
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    itoa(hd.UnpSize,UnpSizeText,ASIZE(UnpSizeText));
 | 
				
			||||||
 | 
					  itoa(hd.PackSize,PackSizeText,ASIZE(PackSizeText));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wchar AttrStr[30];
 | 
				
			||||||
 | 
					  if (hd.HeaderType==HEAD_SERVICE)
 | 
				
			||||||
 | 
					    swprintf(AttrStr,ASIZE(AttrStr),L"%cB",hd.Inherited ? 'I' : '.');
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    ListFileAttr(hd.FileAttr,hd.HSType,AttrStr,ASIZE(AttrStr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wchar RatioStr[10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (hd.SplitBefore && hd.SplitAfter)
 | 
				
			||||||
 | 
					    wcsncpyz(RatioStr,L"<->",ASIZE(RatioStr));
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    if (hd.SplitBefore)
 | 
				
			||||||
 | 
					      wcsncpyz(RatioStr,L"<--",ASIZE(RatioStr));
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      if (hd.SplitAfter)
 | 
				
			||||||
 | 
					        wcsncpyz(RatioStr,L"-->",ASIZE(RatioStr));
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        swprintf(RatioStr,ASIZE(RatioStr),L"%d%%",ToPercentUnlim(hd.PackSize,hd.UnpSize));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wchar DateStr[50];
 | 
				
			||||||
 | 
					  hd.mtime.GetText(DateStr,ASIZE(DateStr),Technical);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Technical)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    mprintf(L"\n%12s: %s",St(MListName),Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool FileBlock=hd.HeaderType==HEAD_FILE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!FileBlock && Arc.SubHead.CmpName(SUBHEAD_TYPE_STREAM))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListType),St(MListStream));
 | 
				
			||||||
 | 
					      wchar StreamName[NM];
 | 
				
			||||||
 | 
					      GetStreamNameNTFS(Arc,StreamName,ASIZE(StreamName));
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListTarget),StreamName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      const wchar *Type=St(FileBlock ? (hd.Dir ? MListDir:MListFile):MListService);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					      if (hd.RedirType!=FSREDIR_NONE)
 | 
				
			||||||
 | 
					        switch(hd.RedirType)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          case FSREDIR_UNIXSYMLINK:
 | 
				
			||||||
 | 
					            Type=St(MListUSymlink); break;
 | 
				
			||||||
 | 
					          case FSREDIR_WINSYMLINK:
 | 
				
			||||||
 | 
					            Type=St(MListWSymlink); break;
 | 
				
			||||||
 | 
					          case FSREDIR_JUNCTION:
 | 
				
			||||||
 | 
					            Type=St(MListJunction); break;
 | 
				
			||||||
 | 
					          case FSREDIR_HARDLINK:
 | 
				
			||||||
 | 
					            Type=St(MListHardlink); break;
 | 
				
			||||||
 | 
					          case FSREDIR_FILECOPY:
 | 
				
			||||||
 | 
					            Type=St(MListCopy);     break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListType),Type);
 | 
				
			||||||
 | 
					      if (hd.RedirType!=FSREDIR_NONE)
 | 
				
			||||||
 | 
					        if (Format==RARFMT15)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          char LinkTargetA[NM];
 | 
				
			||||||
 | 
					          if (Arc.FileHead.Encrypted)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            // Link data are encrypted. We would need to ask for password
 | 
				
			||||||
 | 
					            // and initialize decryption routine to display the link target.
 | 
				
			||||||
 | 
					            strncpyz(LinkTargetA,"*<-?->",ASIZE(LinkTargetA));
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            int DataSize=(int)Min(hd.PackSize,ASIZE(LinkTargetA)-1);
 | 
				
			||||||
 | 
					            Arc.Read(LinkTargetA,DataSize);
 | 
				
			||||||
 | 
					            LinkTargetA[DataSize > 0 ? DataSize : 0] = 0;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          wchar LinkTarget[NM];
 | 
				
			||||||
 | 
					          CharToWide(LinkTargetA,LinkTarget,ASIZE(LinkTarget));
 | 
				
			||||||
 | 
					          mprintf(L"\n%12ls: %ls",St(MListTarget),LinkTarget);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          mprintf(L"\n%12ls: %ls",St(MListTarget),hd.RedirName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!hd.Dir)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListSize),UnpSizeText);
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListPacked),PackSizeText);
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListRatio),RatioStr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (hd.mtime.IsSet())
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListMtime),DateStr);
 | 
				
			||||||
 | 
					    if (hd.ctime.IsSet())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      hd.ctime.GetText(DateStr,ASIZE(DateStr),true);
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListCtime),DateStr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (hd.atime.IsSet())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      hd.atime.GetText(DateStr,ASIZE(DateStr),true);
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListAtime),DateStr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    mprintf(L"\n%12ls: %ls",St(MListAttr),AttrStr);
 | 
				
			||||||
 | 
					    if (hd.FileHash.Type==HASH_CRC32)
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %8.8X",
 | 
				
			||||||
 | 
					        hd.UseHashKey ? L"CRC32 MAC":hd.SplitAfter ? L"Pack-CRC32":L"CRC32",
 | 
				
			||||||
 | 
					        hd.FileHash.CRC32);
 | 
				
			||||||
 | 
					    if (hd.FileHash.Type==HASH_BLAKE2)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wchar BlakeStr[BLAKE2_DIGEST_SIZE*2+1];
 | 
				
			||||||
 | 
					      BinToHex(hd.FileHash.Digest,BLAKE2_DIGEST_SIZE,NULL,BlakeStr,ASIZE(BlakeStr));
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",
 | 
				
			||||||
 | 
					        hd.UseHashKey ? L"BLAKE2 MAC":hd.SplitAfter ? L"Pack-BLAKE2":L"BLAKE2",
 | 
				
			||||||
 | 
					        BlakeStr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const wchar *HostOS=L"";
 | 
				
			||||||
 | 
					    if (Format==RARFMT50 && hd.HSType!=HSYS_UNKNOWN)
 | 
				
			||||||
 | 
					      HostOS=hd.HSType==HSYS_WINDOWS ? L"Windows":L"Unix";
 | 
				
			||||||
 | 
					    if (Format==RARFMT15)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      static const wchar *RarOS[]={
 | 
				
			||||||
 | 
					        L"DOS",L"OS/2",L"Windows",L"Unix",L"Mac OS",L"BeOS",L"WinCE",L"",L"",L""
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      if (hd.HostOS<ASIZE(RarOS))
 | 
				
			||||||
 | 
					        HostOS=RarOS[hd.HostOS];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (*HostOS!=0)
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: %ls",St(MListHostOS),HostOS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mprintf(L"\n%12ls: RAR %ls(v%d) -m%d -md=%d%s",St(MListCompInfo),
 | 
				
			||||||
 | 
					            Format==RARFMT15 ? L"1.5":L"5.0",
 | 
				
			||||||
 | 
					            hd.UnpVer==VER_UNKNOWN ? 0 : hd.UnpVer,hd.Method,
 | 
				
			||||||
 | 
					            hd.WinSize>=0x100000 ? hd.WinSize/0x100000:hd.WinSize/0x400,
 | 
				
			||||||
 | 
					            hd.WinSize>=0x100000 ? L"M":L"K");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (hd.Solid || hd.Encrypted)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: ",St(MListFlags));
 | 
				
			||||||
 | 
					      if (hd.Solid)
 | 
				
			||||||
 | 
					        mprintf(L"%ls ",St(MListSolid));
 | 
				
			||||||
 | 
					      if (hd.Encrypted)
 | 
				
			||||||
 | 
					        mprintf(L"%ls ",St(MListEnc));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (hd.Version)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      uint Version=ParseVersionFileName(Name,false);
 | 
				
			||||||
 | 
					      if (Version!=0)
 | 
				
			||||||
 | 
					        mprintf(L"\n%12ls: %u",St(MListFileVer),Version);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (hd.UnixOwnerSet)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      mprintf(L"\n%12ls: ",L"Unix owner");
 | 
				
			||||||
 | 
					      if (*hd.UnixOwnerName!=0)
 | 
				
			||||||
 | 
					        mprintf(L"%ls:",GetWide(hd.UnixOwnerName));
 | 
				
			||||||
 | 
					      if (*hd.UnixGroupName!=0)
 | 
				
			||||||
 | 
					        mprintf(L"%ls",GetWide(hd.UnixGroupName));
 | 
				
			||||||
 | 
					      if ((*hd.UnixOwnerName!=0 || *hd.UnixGroupName!=0) && (hd.UnixOwnerNumeric || hd.UnixGroupNumeric))
 | 
				
			||||||
 | 
					        mprintf(L"  ");
 | 
				
			||||||
 | 
					      if (hd.UnixOwnerNumeric)
 | 
				
			||||||
 | 
					        mprintf(L"#%d:",hd.UnixOwnerID);
 | 
				
			||||||
 | 
					      if (hd.UnixGroupNumeric)
 | 
				
			||||||
 | 
					        mprintf(L"#%d:",hd.UnixGroupID);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mprintf(L"\n");
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mprintf(L"\n%c%10ls %9ls ",hd.Encrypted ? '*' : ' ',AttrStr,UnpSizeText);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Verbose)
 | 
				
			||||||
 | 
					    mprintf(L"%9ls %4ls ",PackSizeText,RatioStr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mprintf(L" %ls  ",DateStr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Verbose)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (hd.FileHash.Type==HASH_CRC32)
 | 
				
			||||||
 | 
					      mprintf(L"%8.8X  ",hd.FileHash.CRC32);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      if (hd.FileHash.Type==HASH_BLAKE2)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        byte *S=hd.FileHash.Digest;
 | 
				
			||||||
 | 
					        mprintf(L"%02x%02x..%02x  ",S[0],S[1],S[31]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        mprintf(L"????????  ");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  mprintf(L"%ls",Name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					void ListSymLink(Archive &Arc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (Arc.FileHead.HSType==HSYS_UNIX && (Arc.FileHead.FileAttr & 0xF000)==0xA000)
 | 
				
			||||||
 | 
					    if (Arc.FileHead.Encrypted)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      // Link data are encrypted. We would need to ask for password
 | 
					      // Link data are encrypted. We would need to ask for password
 | 
				
			||||||
      // and initialize decryption routine to display the link target.
 | 
					      // and initialize decryption routine to display the link target.
 | 
				
			||||||
      mprintf("\n%22s %s","-->","*<-?->");
 | 
					      mprintf(L"\n%22ls %ls",L"-->",L"*<-?->");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      char FileName[NM];
 | 
				
			||||||
 | 
					      uint DataSize=(uint)Min(Arc.FileHead.PackSize,sizeof(FileName)-1);
 | 
				
			||||||
 | 
					      Arc.Read(FileName,DataSize);
 | 
				
			||||||
 | 
					      FileName[DataSize]=0;
 | 
				
			||||||
 | 
					      mprintf(L"\n%22ls %ls",L"-->",GetWide(FileName));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ListFileAttr(uint A,HOST_SYSTEM_TYPE HostType,wchar *AttrStr,size_t AttrSize)
 | 
				
			||||||
void ListFileAttr(uint A,int HostOS)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  switch(HostOS)
 | 
					  switch(HostType)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    case HOST_MSDOS:
 | 
					    case HSYS_WINDOWS:
 | 
				
			||||||
    case HOST_OS2:
 | 
					      swprintf(AttrStr,AttrSize,L"%c%c%c%c%c%c%c",
 | 
				
			||||||
    case HOST_WIN32:
 | 
					              (A & 0x2000)!=0 ? 'I' : '.',  // Not content indexed.
 | 
				
			||||||
    case HOST_MACOS:
 | 
					              (A & 0x0800)!=0 ? 'C' : '.',  // Compressed.
 | 
				
			||||||
      mprintf(" %c%c%c%c%c%c%c  ",
 | 
					              (A & 0x0020)!=0 ? 'A' : '.',  // Archive.
 | 
				
			||||||
              (A & 0x08) ? 'V' : '.',
 | 
					              (A & 0x0010)!=0 ? 'D' : '.',  // Directory.
 | 
				
			||||||
              (A & 0x10) ? 'D' : '.',
 | 
					              (A & 0x0004)!=0 ? 'S' : '.',  // System.
 | 
				
			||||||
              (A & 0x01) ? 'R' : '.',
 | 
					              (A & 0x0002)!=0 ? 'H' : '.',  // Hidden.
 | 
				
			||||||
              (A & 0x02) ? 'H' : '.',
 | 
					              (A & 0x0001)!=0 ? 'R' : '.'); // Read-only.
 | 
				
			||||||
              (A & 0x04) ? 'S' : '.',
 | 
					 | 
				
			||||||
              (A & 0x20) ? 'A' : '.',
 | 
					 | 
				
			||||||
              (A & 0x800) ? 'C' : '.');
 | 
					 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case HOST_UNIX:
 | 
					    case HSYS_UNIX:
 | 
				
			||||||
    case HOST_BEOS:
 | 
					 | 
				
			||||||
      switch (A & 0xF000)
 | 
					      switch (A & 0xF000)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        case 0x4000:
 | 
					        case 0x4000:
 | 
				
			||||||
          mprintf("d");
 | 
					          AttrStr[0]='d';
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case 0xA000:
 | 
					        case 0xA000:
 | 
				
			||||||
          mprintf("l");
 | 
					          AttrStr[0]='l';
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
          mprintf("-");
 | 
					          AttrStr[0]='-';
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      mprintf("%c%c%c%c%c%c%c%c%c",
 | 
					      swprintf(AttrStr+1,AttrSize-1,L"%c%c%c%c%c%c%c%c%c",
 | 
				
			||||||
              (A & 0x0100) ? 'r' : '-',
 | 
					              (A & 0x0100) ? 'r' : '-',
 | 
				
			||||||
              (A & 0x0080) ? 'w' : '-',
 | 
					              (A & 0x0080) ? 'w' : '-',
 | 
				
			||||||
              (A & 0x0040) ? ((A & 0x0800) ? 's':'x'):((A & 0x0800) ? 'S':'-'),
 | 
					              (A & 0x0040) ? ((A & 0x0800)!=0 ? 's':'x'):((A & 0x0800)!=0 ? 'S':'-'),
 | 
				
			||||||
              (A & 0x0020) ? 'r' : '-',
 | 
					              (A & 0x0020) ? 'r' : '-',
 | 
				
			||||||
              (A & 0x0010) ? 'w' : '-',
 | 
					              (A & 0x0010) ? 'w' : '-',
 | 
				
			||||||
              (A & 0x0008) ? ((A & 0x0400) ? 's':'x'):((A & 0x0400) ? 'S':'-'),
 | 
					              (A & 0x0008) ? ((A & 0x0400)!=0 ? 's':'x'):((A & 0x0400)!=0 ? 'S':'-'),
 | 
				
			||||||
              (A & 0x0004) ? 'r' : '-',
 | 
					              (A & 0x0004) ? 'r' : '-',
 | 
				
			||||||
              (A & 0x0002) ? 'w' : '-',
 | 
					              (A & 0x0002) ? 'w' : '-',
 | 
				
			||||||
              (A & 0x0001) ? 'x' : '-');
 | 
					              (A & 0x0001) ? ((A & 0x200)!=0 ? 't' : 'x') : '-');
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case HSYS_UNKNOWN:
 | 
				
			||||||
 | 
					      wcsncpyz(AttrStr,L"?",AttrSize);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
void ListOldSubHeader(Archive &Arc)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  switch(Arc.SubBlockHead.SubType)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    case EA_HEAD:
 | 
					 | 
				
			||||||
      mprintf(St(MListEAHead));
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case UO_HEAD:
 | 
					 | 
				
			||||||
      mprintf(St(MListUOHead),Arc.UOHead.OwnerName,Arc.UOHead.GroupName);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case MAC_HEAD:
 | 
					 | 
				
			||||||
      mprintf(St(MListMACHead1),Arc.MACHead.fileType>>24,Arc.MACHead.fileType>>16,Arc.MACHead.fileType>>8,Arc.MACHead.fileType);
 | 
					 | 
				
			||||||
      mprintf(St(MListMACHead2),Arc.MACHead.fileCreator>>24,Arc.MACHead.fileCreator>>16,Arc.MACHead.fileCreator>>8,Arc.MACHead.fileCreator);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case BEEA_HEAD:
 | 
					 | 
				
			||||||
      mprintf(St(MListBeEAHead));
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case NTACL_HEAD:
 | 
					 | 
				
			||||||
      mprintf(St(MListNTACLHead));
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case STREAM_HEAD:
 | 
					 | 
				
			||||||
      mprintf(St(MListStrmHead),Arc.StreamHead.StreamName);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
      mprintf(St(MListUnkHead),Arc.SubBlockHead.SubType);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ListNewSubHeader(CommandData *Cmd,Archive &Arc,bool Technical)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (Arc.SubHead.CmpName(SUBHEAD_TYPE_CMT) &&
 | 
					 | 
				
			||||||
      (Arc.SubHead.Flags & LHD_SPLIT_BEFORE)==0 && !Cmd->DisableComment)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Array<byte> CmtData;
 | 
					 | 
				
			||||||
    size_t ReadSize=Arc.ReadCommentData(&CmtData,NULL);
 | 
					 | 
				
			||||||
    if (ReadSize!=0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      mprintf(St(MFileComment));
 | 
					 | 
				
			||||||
      OutComment((char *)&CmtData[0],ReadSize);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  if (Arc.SubHead.CmpName(SUBHEAD_TYPE_STREAM) &&
 | 
					 | 
				
			||||||
      (Arc.SubHead.Flags & LHD_SPLIT_BEFORE)==0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    size_t DestSize=Arc.SubHead.SubData.Size()/2;
 | 
					 | 
				
			||||||
    wchar DestNameW[NM];
 | 
					 | 
				
			||||||
    char DestName[NM];
 | 
					 | 
				
			||||||
    if (DestSize<sizeof(DestName))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      RawToWide(&Arc.SubHead.SubData[0],DestNameW,DestSize);
 | 
					 | 
				
			||||||
      DestNameW[DestSize]=0;
 | 
					 | 
				
			||||||
      WideToChar(DestNameW,DestName);
 | 
					 | 
				
			||||||
      mprintf("\n %s",DestName);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,354 +1,382 @@
 | 
				
			||||||
#define   MYesNo             "_Yes_No"
 | 
					#define   MYesNo             L"_Yes_No"
 | 
				
			||||||
#define   MYesNoAll          "_Yes_No_All"
 | 
					#define   MYesNoAll          L"_Yes_No_All"
 | 
				
			||||||
#define   MYesNoAllQ         "_Yes_No_All_nEver_Quit"
 | 
					#define   MYesNoAllQ         L"_Yes_No_All_nEver_Quit"
 | 
				
			||||||
#define   MYesNoAllRenQ      "_Yes_No_All_nEver_Rename_Quit"
 | 
					#define   MYesNoAllRenQ      L"_Yes_No_All_nEver_Rename_Quit"
 | 
				
			||||||
#define   MContinueQuit      "_Continue_Quit"
 | 
					#define   MContinueQuit      L"_Continue_Quit"
 | 
				
			||||||
#define   MRetryAbort        "_Retry_Abort"
 | 
					#define   MRetryAbort        L"_Retry_Abort"
 | 
				
			||||||
#define   MCopyright         "\nRAR %s   Copyright (c) 1993-%d Alexander Roshal   %d %s %d"
 | 
					#define   MCopyright         L"\nRAR %s   Copyright (c) 1993-%d Alexander Roshal   %d %s %d"
 | 
				
			||||||
#define   MRegTo             "\nRegistered to %s\n"
 | 
					#define   MRegTo             L"\nRegistered to %s\n"
 | 
				
			||||||
#define   MShare             "\nShareware version         Type RAR -? for help\n"
 | 
					#define   MShare             L"\nTrial version             Type 'rar -?' for help\n"
 | 
				
			||||||
#define   MUCopyright        "\nUNRAR %s freeware      Copyright (c) 1993-%d Alexander Roshal\n"
 | 
					#define   MRegKeyWarning     L"\nAvailable license key is valid only for %s\n"
 | 
				
			||||||
#define   MBeta              "beta"
 | 
					#define   MUCopyright        L"\nUNRAR %s freeware      Copyright (c) 1993-%d Alexander Roshal\n"
 | 
				
			||||||
#define   MMonthJan          "Jan"
 | 
					#define   MBeta              L"beta"
 | 
				
			||||||
#define   MMonthFeb          "Feb"
 | 
					#define   Mx86               L"x86"
 | 
				
			||||||
#define   MMonthMar          "Mar"
 | 
					#define   Mx64               L"x64"
 | 
				
			||||||
#define   MMonthApr          "Apr"
 | 
					#define   MMonthJan          L"Jan"
 | 
				
			||||||
#define   MMonthMay          "May"
 | 
					#define   MMonthFeb          L"Feb"
 | 
				
			||||||
#define   MMonthJun          "Jun"
 | 
					#define   MMonthMar          L"Mar"
 | 
				
			||||||
#define   MMonthJul          "Jul"
 | 
					#define   MMonthApr          L"Apr"
 | 
				
			||||||
#define   MMonthAug          "Aug"
 | 
					#define   MMonthMay          L"May"
 | 
				
			||||||
#define   MMonthSep          "Sep"
 | 
					#define   MMonthJun          L"Jun"
 | 
				
			||||||
#define   MMonthOct          "Oct"
 | 
					#define   MMonthJul          L"Jul"
 | 
				
			||||||
#define   MMonthNov          "Nov"
 | 
					#define   MMonthAug          L"Aug"
 | 
				
			||||||
#define   MMonthDec          "Dec"
 | 
					#define   MMonthSep          L"Sep"
 | 
				
			||||||
#define   MRARTitle1         "\nUsage:     rar <command> -<switch 1> -<switch N> <archive> <files...>"
 | 
					#define   MMonthOct          L"Oct"
 | 
				
			||||||
#define   MUNRARTitle1       "\nUsage:     unrar <command> -<switch 1> -<switch N> <archive> <files...>"
 | 
					#define   MMonthNov          L"Nov"
 | 
				
			||||||
#define   MRARTitle2         "\n               <@listfiles...> <path_to_extract\\>"
 | 
					#define   MMonthDec          L"Dec"
 | 
				
			||||||
#define   MCHelpCmd          "\n\n<Commands>"
 | 
					#define   MRARTitle1         L"\nUsage:     rar <command> -<switch 1> -<switch N> <archive> <files...>"
 | 
				
			||||||
#define   MCHelpCmdA         "\n  a             Add files to archive"
 | 
					#define   MUNRARTitle1       L"\nUsage:     unrar <command> -<switch 1> -<switch N> <archive> <files...>"
 | 
				
			||||||
#define   MCHelpCmdC         "\n  c             Add archive comment"
 | 
					#define   MRARTitle2         L"\n               <@listfiles...> <path_to_extract\\>"
 | 
				
			||||||
#define   MCHelpCmdCF        "\n  cf            Add files comment"
 | 
					#define   MCHelpCmd          L"\n\n<Commands>"
 | 
				
			||||||
#define   MCHelpCmdCH        "\n  ch            Change archive parameters"
 | 
					#define   MCHelpCmdA         L"\n  a             Add files to archive"
 | 
				
			||||||
#define   MCHelpCmdCW        "\n  cw            Write archive comment to file"
 | 
					#define   MCHelpCmdC         L"\n  c             Add archive comment"
 | 
				
			||||||
#define   MCHelpCmdD         "\n  d             Delete files from archive"
 | 
					#define   MCHelpCmdCH        L"\n  ch            Change archive parameters"
 | 
				
			||||||
#define   MCHelpCmdE         "\n  e             Extract files to current directory"
 | 
					#define   MCHelpCmdCW        L"\n  cw            Write archive comment to file"
 | 
				
			||||||
#define   MCHelpCmdF         "\n  f             Freshen files in archive"
 | 
					#define   MCHelpCmdD         L"\n  d             Delete files from archive"
 | 
				
			||||||
#define   MCHelpCmdI         "\n  i[par]=<str>  Find string in archives"
 | 
					#define   MCHelpCmdE         L"\n  e             Extract files without archived paths"
 | 
				
			||||||
#define   MCHelpCmdK         "\n  k             Lock archive"
 | 
					#define   MCHelpCmdF         L"\n  f             Freshen files in archive"
 | 
				
			||||||
#define   MCHelpCmdL         "\n  l[t,b]        List archive [technical, bare]"
 | 
					#define   MCHelpCmdI         L"\n  i[par]=<str>  Find string in archives"
 | 
				
			||||||
#define   MCHelpCmdM         "\n  m[f]          Move to archive [files only]"
 | 
					#define   MCHelpCmdK         L"\n  k             Lock archive"
 | 
				
			||||||
#define   MCHelpCmdP         "\n  p             Print file to stdout"
 | 
					#define   MCHelpCmdL         L"\n  l[t[a],b]     List archive contents [technical[all], bare]"
 | 
				
			||||||
#define   MCHelpCmdR         "\n  r             Repair archive"
 | 
					#define   MCHelpCmdM         L"\n  m[f]          Move to archive [files only]"
 | 
				
			||||||
#define   MCHelpCmdRC        "\n  rc            Reconstruct missing volumes"
 | 
					#define   MCHelpCmdP         L"\n  p             Print file to stdout"
 | 
				
			||||||
#define   MCHelpCmdRN        "\n  rn            Rename archived files"
 | 
					#define   MCHelpCmdR         L"\n  r             Repair archive"
 | 
				
			||||||
#define   MCHelpCmdRR        "\n  rr[N]         Add data recovery record"
 | 
					#define   MCHelpCmdRC        L"\n  rc            Reconstruct missing volumes"
 | 
				
			||||||
#define   MCHelpCmdRV        "\n  rv[N]         Create recovery volumes"
 | 
					#define   MCHelpCmdRN        L"\n  rn            Rename archived files"
 | 
				
			||||||
#define   MCHelpCmdS         "\n  s[name|-]     Convert archive to or from SFX"
 | 
					#define   MCHelpCmdRR        L"\n  rr[N]         Add data recovery record"
 | 
				
			||||||
#define   MCHelpCmdT         "\n  t             Test archive files"
 | 
					#define   MCHelpCmdRV        L"\n  rv[N]         Create recovery volumes"
 | 
				
			||||||
#define   MCHelpCmdU         "\n  u             Update files in archive"
 | 
					#define   MCHelpCmdS         L"\n  s[name|-]     Convert archive to or from SFX"
 | 
				
			||||||
#define   MCHelpCmdV         "\n  v[t,b]        Verbosely list archive [technical,bare]"
 | 
					#define   MCHelpCmdT         L"\n  t             Test archive files"
 | 
				
			||||||
#define   MCHelpCmdX         "\n  x             Extract files with full path"
 | 
					#define   MCHelpCmdU         L"\n  u             Update files in archive"
 | 
				
			||||||
#define   MCHelpSw           "\n\n<Switches>"
 | 
					#define   MCHelpCmdV         L"\n  v[t[a],b]     Verbosely list archive contents [technical[all],bare]"
 | 
				
			||||||
#define   MCHelpSwm          "\n  -             Stop switches scanning"
 | 
					#define   MCHelpCmdX         L"\n  x             Extract files with full path"
 | 
				
			||||||
#define   MCHelpSwAC         "\n  ac            Clear Archive attribute after compression or extraction"
 | 
					#define   MCHelpSw           L"\n\n<Switches>"
 | 
				
			||||||
#define   MCHelpSwAD         "\n  ad            Append archive name to destination path"
 | 
					#define   MCHelpSwm          L"\n  -             Stop switches scanning"
 | 
				
			||||||
#define   MCHelpSwAG         "\n  ag[format]    Generate archive name using the current date"
 | 
					#define   MCHelpSwAT         L"\n  @[+]          Disable [enable] file lists"
 | 
				
			||||||
#define   MCHelpSwAI         "\n  ai            Ignore file attributes"
 | 
					#define   MCHelpSwAC         L"\n  ac            Clear Archive attribute after compression or extraction"
 | 
				
			||||||
#define   MCHelpSwAO         "\n  ao            Add files with Archive attribute set"
 | 
					#define   MCHelpSwAD         L"\n  ad            Append archive name to destination path"
 | 
				
			||||||
#define   MCHelpSwAP         "\n  ap<path>      Set path inside archive"
 | 
					#define   MCHelpSwAG         L"\n  ag[format]    Generate archive name using the current date"
 | 
				
			||||||
#define   MCHelpSwAS         "\n  as            Synchronize archive contents"
 | 
					#define   MCHelpSwAI         L"\n  ai            Ignore file attributes"
 | 
				
			||||||
#define   MCHelpSwAV         "\n  av            Put authenticity verification (registered versions only)"
 | 
					#define   MCHelpSwAO         L"\n  ao            Add files with Archive attribute set"
 | 
				
			||||||
#define   MCHelpSwAVm        "\n  av-           Disable authenticity verification check"
 | 
					#define   MCHelpSwAP         L"\n  ap<path>      Set path inside archive"
 | 
				
			||||||
#define   MCHelpSwCm         "\n  c-            Disable comments show"
 | 
					#define   MCHelpSwAS         L"\n  as            Synchronize archive contents"
 | 
				
			||||||
#define   MCHelpSwCFGm       "\n  cfg-          Disable read configuration"
 | 
					#define   MCHelpSwCm         L"\n  c-            Disable comments show"
 | 
				
			||||||
#define   MCHelpSwCL         "\n  cl            Convert names to lower case"
 | 
					#define   MCHelpSwCFGm       L"\n  cfg-          Disable read configuration"
 | 
				
			||||||
#define   MCHelpSwCU         "\n  cu            Convert names to upper case"
 | 
					#define   MCHelpSwCL         L"\n  cl            Convert names to lower case"
 | 
				
			||||||
#define   MCHelpSwDF         "\n  df            Delete files after archiving"
 | 
					#define   MCHelpSwCU         L"\n  cu            Convert names to upper case"
 | 
				
			||||||
#define   MCHelpSwDH         "\n  dh            Open shared files"
 | 
					#define   MCHelpSwDF         L"\n  df            Delete files after archiving"
 | 
				
			||||||
#define   MCHelpSwDR         "\n  dr            Delete files to Recycle Bin"
 | 
					#define   MCHelpSwDH         L"\n  dh            Open shared files"
 | 
				
			||||||
#define   MCHelpSwDS         "\n  ds            Disable name sort for solid archive"
 | 
					#define   MCHelpSwDR         L"\n  dr            Delete files to Recycle Bin"
 | 
				
			||||||
#define   MCHelpSwDW         "\n  dw            Wipe files after archiving"
 | 
					#define   MCHelpSwDS         L"\n  ds            Disable name sort for solid archive"
 | 
				
			||||||
#define   MCHelpSwEa         "\n  e[+]<attr>    Set file exclude and include attributes"
 | 
					#define   MCHelpSwDW         L"\n  dw            Wipe files after archiving"
 | 
				
			||||||
#define   MCHelpSwED         "\n  ed            Do not add empty directories"
 | 
					#define   MCHelpSwEa         L"\n  e[+]<attr>    Set file exclude and include attributes"
 | 
				
			||||||
#define   MCHelpSwEE         "\n  ee            Do not save and extract extended attributes"
 | 
					#define   MCHelpSwED         L"\n  ed            Do not add empty directories"
 | 
				
			||||||
#define   MCHelpSwEN         "\n  en            Do not put 'end of archive' block"
 | 
					#define   MCHelpSwEN         L"\n  en            Do not put 'end of archive' block"
 | 
				
			||||||
#define   MCHelpSwEP         "\n  ep            Exclude paths from names"
 | 
					#define   MCHelpSwEP         L"\n  ep            Exclude paths from names"
 | 
				
			||||||
#define   MCHelpSwEP1        "\n  ep1           Exclude base directory from names"
 | 
					#define   MCHelpSwEP1        L"\n  ep1           Exclude base directory from names"
 | 
				
			||||||
#define   MCHelpSwEP2        "\n  ep2           Expand paths to full"
 | 
					#define   MCHelpSwEP2        L"\n  ep2           Expand paths to full"
 | 
				
			||||||
#define   MCHelpSwEP3        "\n  ep3           Expand paths to full including the drive letter"
 | 
					#define   MCHelpSwEP3        L"\n  ep3           Expand paths to full including the drive letter"
 | 
				
			||||||
#define   MCHelpSwF          "\n  f             Freshen files"
 | 
					#define   MCHelpSwF          L"\n  f             Freshen files"
 | 
				
			||||||
#define   MCHelpSwHP         "\n  hp[password]  Encrypt both file data and headers"
 | 
					#define   MCHelpSwHP         L"\n  hp[password]  Encrypt both file data and headers"
 | 
				
			||||||
#define   MCHelpSwIDP        "\n  id[c,d,p,q]   Disable messages"
 | 
					#define   MCHelpSwHT         L"\n  ht[b|c]       Select hash type [BLAKE2,CRC32] for file checksum"
 | 
				
			||||||
#define   MCHelpSwIEML       "\n  ieml[addr]    Send archive by email"
 | 
					#define   MCHelpSwIDP        L"\n  id[c,d,p,q]   Disable messages"
 | 
				
			||||||
#define   MCHelpSwIERR       "\n  ierr          Send all messages to stderr"
 | 
					#define   MCHelpSwIEML       L"\n  ieml[addr]    Send archive by email"
 | 
				
			||||||
#define   MCHelpSwILOG       "\n  ilog[name]    Log errors to file (registered versions only)"
 | 
					#define   MCHelpSwIERR       L"\n  ierr          Send all messages to stderr"
 | 
				
			||||||
#define   MCHelpSwINUL       "\n  inul          Disable all messages"
 | 
					#define   MCHelpSwILOG       L"\n  ilog[name]    Log errors to file"
 | 
				
			||||||
#define   MCHelpSwIOFF       "\n  ioff          Turn PC off after completing an operation"
 | 
					#define   MCHelpSwINUL       L"\n  inul          Disable all messages"
 | 
				
			||||||
#define   MCHelpSwISND       "\n  isnd          Enable sound"
 | 
					#define   MCHelpSwIOFF       L"\n  ioff[n]       Turn PC off after completing an operation"
 | 
				
			||||||
#define   MCHelpSwK          "\n  k             Lock archive"
 | 
					#define   MCHelpSwISND       L"\n  isnd[-]       Control notification sounds"
 | 
				
			||||||
#define   MCHelpSwKB         "\n  kb            Keep broken extracted files"
 | 
					#define   MCHelpSwIVER       L"\n  iver          Display the version number"
 | 
				
			||||||
#define   MCHelpSwMn         "\n  m<0..5>       Set compression level (0-store...3-default...5-maximal)"
 | 
					#define   MCHelpSwK          L"\n  k             Lock archive"
 | 
				
			||||||
#define   MCHelpSwMC         "\n  mc<par>       Set advanced compression parameters"
 | 
					#define   MCHelpSwKB         L"\n  kb            Keep broken extracted files"
 | 
				
			||||||
#define   MCHelpSwMD         "\n  md<size>      Dictionary size in KB (64,128,256,512,1024,2048,4096 or A-G)"
 | 
					#define   MCHelpSwLog        L"\n  log[f][=name] Write names to log file"
 | 
				
			||||||
#define   MCHelpSwMS         "\n  ms[ext;ext]   Specify file types to store"
 | 
					#define   MCHelpSwMn         L"\n  m<0..5>       Set compression level (0-store...3-default...5-maximal)"
 | 
				
			||||||
#define   MCHelpSwMT         "\n  mt<threads>   Set the number of threads"
 | 
					#define   MCHelpSwMA         L"\n  ma[4|5]       Specify a version of archiving format"
 | 
				
			||||||
#define   MCHelpSwN          "\n  n<file>       Include only specified file"
 | 
					#define   MCHelpSwMC         L"\n  mc<par>       Set advanced compression parameters"
 | 
				
			||||||
#define   MCHelpSwNa         "\n  n@            Read file names to include from stdin"
 | 
					#define   MCHelpSwMD         L"\n  md<n>[k,m,g]  Dictionary size in KB, MB or GB"
 | 
				
			||||||
#define   MCHelpSwNal        "\n  n@<list>      Include files listed in specified list file"
 | 
					#define   MCHelpSwMS         L"\n  ms[ext;ext]   Specify file types to store"
 | 
				
			||||||
#define   MCHelpSwO          "\n  o[+|-]        Set the overwrite mode"
 | 
					#define   MCHelpSwMT         L"\n  mt<threads>   Set the number of threads"
 | 
				
			||||||
#define   MCHelpSwOC         "\n  oc            Set NTFS Compressed attribute"
 | 
					#define   MCHelpSwN          L"\n  n<file>       Additionally filter included files"
 | 
				
			||||||
#define   MCHelpSwOL         "\n  ol            Save symbolic links as the link instead of the file"
 | 
					#define   MCHelpSwNa         L"\n  n@            Read additional filter masks from stdin"
 | 
				
			||||||
#define   MCHelpSwOR         "\n  or            Rename files automatically"
 | 
					#define   MCHelpSwNal        L"\n  n@<list>      Read additional filter masks from list file"
 | 
				
			||||||
#define   MCHelpSwOS         "\n  os            Save NTFS streams"
 | 
					#define   MCHelpSwO          L"\n  o[+|-]        Set the overwrite mode"
 | 
				
			||||||
#define   MCHelpSwOW         "\n  ow            Save or restore file owner and group"
 | 
					#define   MCHelpSwOC         L"\n  oc            Set NTFS Compressed attribute"
 | 
				
			||||||
#define   MCHelpSwP          "\n  p[password]   Set password"
 | 
					#define   MCHelpSwOH         L"\n  oh            Save hard links as the link instead of the file"
 | 
				
			||||||
#define   MCHelpSwPm         "\n  p-            Do not query password"
 | 
					#define   MCHelpSwOI         L"\n  oi[0-4][:min] Save identical files as references"
 | 
				
			||||||
#define   MCHelpSwR          "\n  r             Recurse subdirectories"
 | 
					#define   MCHelpSwOL         L"\n  ol[a]         Process symbolic links as the link [absolute paths]"
 | 
				
			||||||
#define   MCHelpSwRm         "\n  r-            Disable recursion"
 | 
					#define   MCHelpSwONI        L"\n  oni           Allow potentially incompatible names"
 | 
				
			||||||
#define   MCHelpSwR0         "\n  r0            Recurse subdirectories for wildcard names only"
 | 
					#define   MCHelpSwOR         L"\n  or            Rename files automatically"
 | 
				
			||||||
#define   MCHelpSwRI         "\n  ri<P>[:<S>]   Set priority (0-default,1-min..15-max) and sleep time in ms"
 | 
					#define   MCHelpSwOS         L"\n  os            Save NTFS streams"
 | 
				
			||||||
#define   MCHelpSwRR         "\n  rr[N]         Add data recovery record"
 | 
					#define   MCHelpSwOW         L"\n  ow            Save or restore file owner and group"
 | 
				
			||||||
#define   MCHelpSwRV         "\n  rv[N]         Create recovery volumes"
 | 
					#define   MCHelpSwP          L"\n  p[password]   Set password"
 | 
				
			||||||
#define   MCHelpSwS          "\n  s[<N>,v[-],e] Create solid archive"
 | 
					#define   MCHelpSwPm         L"\n  p-            Do not query password"
 | 
				
			||||||
#define   MCHelpSwSm         "\n  s-            Disable solid archiving"
 | 
					#define   MCHelpSwQO         L"\n  qo[-|+]       Add quick open information [none|force]"
 | 
				
			||||||
#define   MCHelpSwSC         "\n  sc<chr>[obj]  Specify the character set"
 | 
					#define   MCHelpSwR          L"\n  r             Recurse subdirectories"
 | 
				
			||||||
#define   MCHelpSwSFX        "\n  sfx[name]     Create SFX archive"
 | 
					#define   MCHelpSwRm         L"\n  r-            Disable recursion"
 | 
				
			||||||
#define   MCHelpSwSI         "\n  si[name]      Read data from standard input (stdin)"
 | 
					#define   MCHelpSwR0         L"\n  r0            Recurse subdirectories for wildcard names only"
 | 
				
			||||||
#define   MCHelpSwSL         "\n  sl<size>      Process files with size less than specified"
 | 
					#define   MCHelpSwRI         L"\n  ri<P>[:<S>]   Set priority (0-default,1-min..15-max) and sleep time in ms"
 | 
				
			||||||
#define   MCHelpSwSM         "\n  sm<size>      Process files with size more than specified"
 | 
					#define   MCHelpSwRR         L"\n  rr[N]         Add data recovery record"
 | 
				
			||||||
#define   MCHelpSwT          "\n  t             Test files after archiving"
 | 
					#define   MCHelpSwRV         L"\n  rv[N]         Create recovery volumes"
 | 
				
			||||||
#define   MCHelpSwTK         "\n  tk            Keep original archive time"
 | 
					#define   MCHelpSwS          L"\n  s[<N>,v[-],e] Create solid archive"
 | 
				
			||||||
#define   MCHelpSwTL         "\n  tl            Set archive time to latest file"
 | 
					#define   MCHelpSwSm         L"\n  s-            Disable solid archiving"
 | 
				
			||||||
#define   MCHelpSwTN         "\n  tn<time>      Process files newer than <time>"
 | 
					#define   MCHelpSwSC         L"\n  sc<chr>[obj]  Specify the character set"
 | 
				
			||||||
#define   MCHelpSwTO         "\n  to<time>      Process files older than <time>"
 | 
					#define   MCHelpSwSFX        L"\n  sfx[name]     Create SFX archive"
 | 
				
			||||||
#define   MCHelpSwTA         "\n  ta<date>      Process files modified after <date> in YYYYMMDDHHMMSS format"
 | 
					#define   MCHelpSwSI         L"\n  si[name]      Read data from standard input (stdin)"
 | 
				
			||||||
#define   MCHelpSwTB         "\n  tb<date>      Process files modified before <date> in YYYYMMDDHHMMSS format"
 | 
					#define   MCHelpSwSL         L"\n  sl<size>      Process files with size less than specified"
 | 
				
			||||||
#define   MCHelpSwTS         "\n  ts<m,c,a>[N]  Save or restore file time (modification, creation, access)"
 | 
					#define   MCHelpSwSM         L"\n  sm<size>      Process files with size more than specified"
 | 
				
			||||||
#define   MCHelpSwU          "\n  u             Update files"
 | 
					#define   MCHelpSwT          L"\n  t             Test files after archiving"
 | 
				
			||||||
#define   MCHelpSwV          "\n  v             Create volumes with size autodetection or list all volumes"
 | 
					#define   MCHelpSwTK         L"\n  tk            Keep original archive time"
 | 
				
			||||||
#define   MCHelpSwVUnr       "\n  v             List all volumes"
 | 
					#define   MCHelpSwTL         L"\n  tl            Set archive time to latest file"
 | 
				
			||||||
#define   MCHelpSwVn         "\n  v<size>[k,b]  Create volumes with size=<size>*1000 [*1024, *1]"
 | 
					#define   MCHelpSwTN         L"\n  tn[mcao]<t>   Process files newer than <t> time"
 | 
				
			||||||
#define   MCHelpSwVD         "\n  vd            Erase disk contents before creating volume"
 | 
					#define   MCHelpSwTO         L"\n  to[mcao]<t>   Process files older than <t> time"
 | 
				
			||||||
#define   MCHelpSwVER        "\n  ver[n]        File version control"
 | 
					#define   MCHelpSwTA         L"\n  ta[mcao]<d>   Process files modified after <d> YYYYMMDDHHMMSS date"
 | 
				
			||||||
#define   MCHelpSwVN         "\n  vn            Use the old style volume naming scheme"
 | 
					#define   MCHelpSwTB         L"\n  tb[mcao]<d>   Process files modified before <d> YYYYMMDDHHMMSS date"
 | 
				
			||||||
#define   MCHelpSwVP         "\n  vp            Pause before each volume"
 | 
					#define   MCHelpSwTS         L"\n  ts[m,c,a,p]   Save or restore time (modification, creation, access, preserve)"
 | 
				
			||||||
#define   MCHelpSwW          "\n  w<path>       Assign work directory"
 | 
					#define   MCHelpSwU          L"\n  u             Update files"
 | 
				
			||||||
#define   MCHelpSwX          "\n  x<file>       Exclude specified file"
 | 
					#define   MCHelpSwV          L"\n  v             Create volumes with size autodetection or list all volumes"
 | 
				
			||||||
#define   MCHelpSwXa         "\n  x@            Read file names to exclude from stdin"
 | 
					#define   MCHelpSwVUnr       L"\n  v             List all volumes"
 | 
				
			||||||
#define   MCHelpSwXal        "\n  x@<list>      Exclude files listed in specified list file"
 | 
					#define   MCHelpSwVn         L"\n  v<size>[k,b]  Create volumes with size=<size>*1000 [*1024, *1]"
 | 
				
			||||||
#define   MCHelpSwY          "\n  y             Assume Yes on all queries"
 | 
					#define   MCHelpSwVD         L"\n  vd            Erase disk contents before creating volume"
 | 
				
			||||||
#define   MCHelpSwZ          "\n  z[file]       Read archive comment from file"
 | 
					#define   MCHelpSwVER        L"\n  ver[n]        File version control"
 | 
				
			||||||
#define   MBadArc            "\nERROR: Bad archive %s\n"
 | 
					#define   MCHelpSwVN         L"\n  vn            Use the old style volume naming scheme"
 | 
				
			||||||
#define   MAskPsw            "Enter password (will not be echoed)"
 | 
					#define   MCHelpSwVP         L"\n  vp            Pause before each volume"
 | 
				
			||||||
#define   MAskPswEcho        "Enter password"
 | 
					#define   MCHelpSwW          L"\n  w<path>       Assign work directory"
 | 
				
			||||||
#define   MReAskPsw          "\nReenter password: "
 | 
					#define   MCHelpSwX          L"\n  x<file>       Exclude specified file"
 | 
				
			||||||
#define   MFor               " for "
 | 
					#define   MCHelpSwXa         L"\n  x@            Read file names to exclude from stdin"
 | 
				
			||||||
#define   MNotMatchPsw       "\nERROR: Passwords do not match\n"
 | 
					#define   MCHelpSwXal        L"\n  x@<list>      Exclude files listed in specified list file"
 | 
				
			||||||
#define   MErrWrite          "Write error in the file %s"
 | 
					#define   MCHelpSwY          L"\n  y             Assume Yes on all queries"
 | 
				
			||||||
#define   MErrRead           "Read error in the file %s"
 | 
					#define   MCHelpSwZ          L"\n  z[file]       Read archive comment from file"
 | 
				
			||||||
#define   MErrSeek           "Seek error in the file %s"
 | 
					#define   MBadArc            L"\nERROR: Bad archive %s\n"
 | 
				
			||||||
#define   MErrFClose         "Cannot close the file %s"
 | 
					#define   MAskPsw            L"Enter password (will not be echoed)"
 | 
				
			||||||
#define   MErrOutMem         "Not enough memory"
 | 
					#define   MAskPswFor         L"\nEnter password (will not be echoed) for %s: "
 | 
				
			||||||
#define   MErrBrokenArc      "Corrupt archive - use 'Repair' command"
 | 
					#define   MReAskPsw          L"\nReenter password: "
 | 
				
			||||||
#define   MProgAborted       "Program aborted"
 | 
					#define   MNotMatchPsw       L"\nERROR: Passwords do not match\n"
 | 
				
			||||||
#define   MErrRename         "\nCannot rename %s to %s"
 | 
					#define   MErrWrite          L"Write error in the file %s"
 | 
				
			||||||
#define   MAbsNextVol        "\nCannot find volume %s"
 | 
					#define   MErrRead           L"Read error in the file %s"
 | 
				
			||||||
#define   MBreak             "\nUser break\n"
 | 
					#define   MErrSeek           L"Seek error in the file %s"
 | 
				
			||||||
#define   MAskCreatVol       "\nCreate next volume ?"
 | 
					#define   MErrFClose         L"Cannot close the file %s"
 | 
				
			||||||
#define   MAskNextDisk       "\nDisk full. Insert next"
 | 
					#define   MErrOutMem         L"Not enough memory"
 | 
				
			||||||
#define   MCreatVol          "\n\nCreating %sarchive %s\n"
 | 
					#define   MErrBrokenArc      L"Corrupt archive - use 'Repair' command"
 | 
				
			||||||
#define   MAskNextVol        "\nInsert disk with %s"
 | 
					#define   MProgAborted       L"Program aborted"
 | 
				
			||||||
#define   MTestVol           "\n\nTesting archive %s\n"
 | 
					#define   MErrRename         L"\nCannot rename %s to %s"
 | 
				
			||||||
#define   MExtrVol           "\n\nExtracting from %s\n"
 | 
					#define   MAbsNextVol        L"\nCannot find volume %s"
 | 
				
			||||||
#define   MConverting        "\nConverting %s"
 | 
					#define   MBreak             L"\nUser break\n"
 | 
				
			||||||
#define   MCvtToSFX          "\nConvert archives to SFX"
 | 
					#define   MAskCreatVol       L"\nCreate next volume ?"
 | 
				
			||||||
#define   MCvtFromSFX        "\nRemoving SFX module"
 | 
					#define   MAskNextDisk       L"\nDisk full. Insert next"
 | 
				
			||||||
#define   MNotSFX            "\n%s is not SFX archive"
 | 
					#define   MCreatVol          L"\n\nCreating %sarchive %s\n"
 | 
				
			||||||
#define   MNotRAR            "\n%s is not RAR archive"
 | 
					#define   MAskNextVol        L"\nInsert disk with %s"
 | 
				
			||||||
#define   MNotFirstVol       "\n%s is not the first volume"
 | 
					#define   MTestVol           L"\n\nTesting archive %s\n"
 | 
				
			||||||
#define   MCvtOldFormat      "\n%s - cannot convert to SFX archive with old format"
 | 
					#define   MExtrVol           L"\n\nExtracting from %s\n"
 | 
				
			||||||
#define   MCannotCreate      "\nCannot create %s"
 | 
					#define   MConverting        L"\nConverting %s"
 | 
				
			||||||
#define   MCannotOpen        "\nCannot open %s"
 | 
					#define   MCvtToSFX          L"\nConvert archives to SFX"
 | 
				
			||||||
#define   MUnknownMeth       "\nUnknown method in %s"
 | 
					#define   MCvtFromSFX        L"\nRemoving SFX module"
 | 
				
			||||||
#define   MVerRequired       "\nYou need RAR %d.%d to unpack it"
 | 
					#define   MNotSFX            L"\n%s is not SFX archive"
 | 
				
			||||||
#define   MOk                " OK"
 | 
					#define   MNotRAR            L"\n%s is not RAR archive"
 | 
				
			||||||
#define   MDone              "\nDone"
 | 
					#define   MNotFirstVol       L"\n%s is not the first volume"
 | 
				
			||||||
#define   MLockingArc        "\nLocking archive"
 | 
					#define   MCvtOldFormat      L"\n%s - cannot convert to SFX archive with old format"
 | 
				
			||||||
#define   MNotMdfOld         "\n\nERROR: Cannot modify old format archive"
 | 
					#define   MCannotCreate      L"\nCannot create %s"
 | 
				
			||||||
#define   MNotMdfLock        "\n\nERROR: Locked archive"
 | 
					#define   MCannotOpen        L"\nCannot open %s"
 | 
				
			||||||
#define   MNotMdfVol         "\n\nERROR: Cannot modify volume"
 | 
					#define   MUnknownMeth       L"\nUnknown method in %s"
 | 
				
			||||||
#define   MVerifyAV          "\nVerifying authenticity information ... "
 | 
					#define   MNewRarFormat      L"\nUnsupported archive format. Please update RAR to a newer version."
 | 
				
			||||||
#define   MFailedAV          " Failed\n"
 | 
					#define   MOk                L" OK"
 | 
				
			||||||
#define   MStrAV1            "\n\nArchive %s"
 | 
					#define   MDone              L"\nDone"
 | 
				
			||||||
#define   MStrAV2            "\ncreated at %s"
 | 
					#define   MLockingArc        L"\nLocking archive"
 | 
				
			||||||
#define   MStrAV3            "\nby %s\n"
 | 
					#define   MNotMdfOld         L"\n\nERROR: Cannot modify old format archive"
 | 
				
			||||||
#define   MLogFailedAV       "Invalid authenticity information"
 | 
					#define   MNotMdfLock        L"\n\nERROR: Locked archive"
 | 
				
			||||||
#define   MAddingAV          "\nAdding authenticity verification "
 | 
					#define   MNotMdfVol         L"\n\nERROR: Cannot modify volume"
 | 
				
			||||||
#define   MAVOldStyle        "\n\nOld style authenticity information"
 | 
					#define   MPackAskReg        L"\nEvaluation copy. Please register.\n"
 | 
				
			||||||
#define   MPackAskReg        "\nEvaluation copy. Please register.\n"
 | 
					#define   MCreateArchive     L"\nCreating %sarchive %s\n"
 | 
				
			||||||
#define   MCreateArchive     "\nCreating %sarchive %s\n"
 | 
					#define   MUpdateArchive     L"\nUpdating %sarchive %s\n"
 | 
				
			||||||
#define   MUpdateArchive     "\nUpdating %sarchive %s\n"
 | 
					#define   MAddSolid          L"solid "
 | 
				
			||||||
#define   MAddSolid          "solid "
 | 
					#define   MAddFile           L"\nAdding    %-58s     "
 | 
				
			||||||
#define   MAddFile           "\nAdding    %-58s     "
 | 
					#define   MUpdFile           L"\nUpdating  %-58s     "
 | 
				
			||||||
#define   MUpdFile           "\nUpdating  %-58s     "
 | 
					#define   MAddPoints         L"\n...       %-58s     "
 | 
				
			||||||
#define   MAddPoints         "\n...       %-58s     "
 | 
					#define   MMoveDelFiles      L"\n\nDeleting files %s..."
 | 
				
			||||||
#define   MCannotUpdPswSolid "\nERROR: Cannot update solid archives with password\n"
 | 
					#define   MMoveDelDirs       L"and directories"
 | 
				
			||||||
#define   MMoveDelFiles      "\n\nDeleting files %s..."
 | 
					#define   MMoveDelFile       L"\nDeleting %-30s"
 | 
				
			||||||
#define   MMoveDelDirs       "and directories"
 | 
					#define   MMoveDeleted       L"    deleted"
 | 
				
			||||||
#define   MMoveDelFile       "\nDeleting %-30s"
 | 
					#define   MMoveNotDeleted    L"    NOT DELETED"
 | 
				
			||||||
#define   MMoveDeleted       "    deleted"
 | 
					#define   MClearAttrib       L"\n\nClearing attributes..."
 | 
				
			||||||
#define   MMoveNotDeleted    "    NOT DELETED"
 | 
					#define   MMoveDelDir        L"\nDeleting directory %-30s"
 | 
				
			||||||
#define   MClearAttrib       "\n\nClearing attributes..."
 | 
					#define   MWarErrFOpen       L"\nWARNING: Cannot open %d %s"
 | 
				
			||||||
#define   MMoveDelDir        "\nDeleting directory %-30s"
 | 
					#define   MErrOpenFiles      L"files"
 | 
				
			||||||
#define   MWarErrFOpen       "\nWARNING: Cannot open %d %s"
 | 
					#define   MErrOpenFile       L"file"
 | 
				
			||||||
#define   MErrOpenFiles      "files"
 | 
					#define   MAddNoFiles        L"\nWARNING: No files"
 | 
				
			||||||
#define   MErrOpenFile       "file"
 | 
					#define   MMdfEncrSol        L"\n%s: encrypted"
 | 
				
			||||||
#define   MAddNoFiles        "\nWARNING: No files"
 | 
					#define   MAddAnalyze        L"\nAnalyzing archived files: "
 | 
				
			||||||
#define   MMdfEncrSol        "\n%s: encrypted"
 | 
					#define   MRepacking         L"\nRepacking archived files: "
 | 
				
			||||||
#define   MCannotMdfEncrSol  "\nCannot modify solid archive containing encrypted files"
 | 
					#define   MCRCFailed         L"\n%-20s - checksum error"
 | 
				
			||||||
#define   MAddAnalyze        "\nAnalyzing archived files: "
 | 
					#define   MExtrTest          L"\n\nTesting archive %s\n"
 | 
				
			||||||
#define   MRepacking         "\nRepacking archived files: "
 | 
					#define   MExtracting        L"\n\nExtracting from %s\n"
 | 
				
			||||||
#define   MCRCFailed         "\n%-20s - CRC failed"
 | 
					#define   MUseCurPsw         L"\n%s - use current password ?"
 | 
				
			||||||
#define   MExtrTest          "\n\nTesting archive %s\n"
 | 
					#define   MCreatDir          L"\nCreating    %-56s"
 | 
				
			||||||
#define   MExtracting        "\n\nExtracting from %s\n"
 | 
					#define   MExtrSkipFile      L"\nSkipping    %-56s"
 | 
				
			||||||
#define   MUseCurPsw         "\n%s - use current password ?"
 | 
					#define   MExtrTestFile      L"\nTesting     %-56s"
 | 
				
			||||||
#define   MCreatDir          "\nCreating    %-56s"
 | 
					#define   MExtrFile          L"\nExtracting  %-56s"
 | 
				
			||||||
#define   MExtrSkipFile      "\nSkipping    %-56s"
 | 
					#define   MExtrPoints        L"\n...         %-56s"
 | 
				
			||||||
#define   MExtrTestFile      "\nTesting     %-56s"
 | 
					#define   MExtrErrMkDir      L"\nCannot create directory %s"
 | 
				
			||||||
#define   MExtrFile          "\nExtracting  %-56s"
 | 
					#define   MExtrPrinting      L"\n------ Printing %s\n\n"
 | 
				
			||||||
#define   MExtrPoints        "\n...         %-56s"
 | 
					#define   MEncrBadCRC        L"\nChecksum error in the encrypted file %s. Corrupt file or wrong password."
 | 
				
			||||||
#define   MExtrErrMkDir      "\nCannot create directory %s"
 | 
					#define   MExtrNoFiles       L"\nNo files to extract"
 | 
				
			||||||
#define   MExtrPrinting      "\n------ Printing %s\n\n"
 | 
					#define   MExtrAllOk         L"\nAll OK"
 | 
				
			||||||
#define   MEncrBadCRC        "\nEncrypted file:  CRC failed in %s (password incorrect ?)"
 | 
					#define   MExtrTotalErr      L"\nTotal errors: %ld"
 | 
				
			||||||
#define   MExtrNoFiles       "\nNo files to extract"
 | 
					#define   MAskReplace        L"\n\nWould you like to replace the existing file %s\n%6s bytes, modified on %s\nwith a new one\n%6s bytes, modified on %s\n"
 | 
				
			||||||
#define   MExtrAllOk         "\nAll OK"
 | 
					#define   MAskOverwrite      L"\nOverwrite %s ?"
 | 
				
			||||||
#define   MExtrTotalErr      "\nTotal errors: %ld"
 | 
					#define   MAskNewName        L"\nEnter new name: "
 | 
				
			||||||
#define   MFileExists        "\n\n%s already exists. Overwrite it ?"
 | 
					#define   MHeaderBroken      L"\nCorrupt header is found"
 | 
				
			||||||
#define   MAskOverwrite      "\nOverwrite %s ?"
 | 
					#define   MMainHeaderBroken  L"\nMain archive header is corrupt"
 | 
				
			||||||
#define   MAskNewName        "\nEnter new name: "
 | 
					#define   MLogFileHead       L"\n%s - the file header is corrupt"
 | 
				
			||||||
#define   MLogMainHead       "\nThe archive header is corrupt"
 | 
					#define   MLogProtectHead    L"The data recovery header is corrupt"
 | 
				
			||||||
#define   MLogFileHead       "\n%s - the file header is corrupt"
 | 
					#define   MReadStdinCmt      L"\nReading comment from stdin\n"
 | 
				
			||||||
#define   MLogCommHead       "\nThe comment header is corrupt\n"
 | 
					#define   MReadCommFrom      L"\nReading comment from %s"
 | 
				
			||||||
#define   MLogProtectHead    "The data recovery header is corrupt"
 | 
					#define   MDelComment        L"\nDeleting comment from %s"
 | 
				
			||||||
#define   MReadStdinCmt      "\nReading comment from stdin\n"
 | 
					#define   MAddComment        L"\nAdding comment to %s"
 | 
				
			||||||
#define   MReadCommFrom      "\nReading comment from %s"
 | 
					#define   MFCommAdd          L"\nAdding file comments"
 | 
				
			||||||
#define   MDelComment        "\nDeleting comment from %s"
 | 
					#define   MAskFComm          L"\n\nReading comment for %s : %s from stdin\n"
 | 
				
			||||||
#define   MAddComment        "\nAdding comment to %s"
 | 
					#define   MLogCommBrk        L"\nThe archive comment is corrupt"
 | 
				
			||||||
#define   MFCommAdd          "\nAdding file comments"
 | 
					#define   MCommAskCont       L"\nPress 'Enter' to continue or 'Q' to quit:"
 | 
				
			||||||
#define   MAskFComm          "\n\nReading comment for %s : %s from stdin\n"
 | 
					#define   MWriteCommTo       L"\nWrite comment to %s"
 | 
				
			||||||
#define   MLogCommBrk        "\nThe archive comment is corrupt"
 | 
					#define   MCommNotPres       L"\nComment is not present"
 | 
				
			||||||
#define   MCommAskCont       "\nPress 'Enter' to continue or 'Q' to quit:"
 | 
					#define   MDelFrom           L"\nDeleting from %s"
 | 
				
			||||||
#define   MLogBrokFCmt       "\nThe file comment is corrupt"
 | 
					#define   MDeleting          L"\nDeleting %s"
 | 
				
			||||||
#define   MWriteCommTo       "\nWrite comment to %s"
 | 
					#define   MEraseArc          L"\nErasing empty archive %s"
 | 
				
			||||||
#define   MCommNotPres       "\nComment is not present"
 | 
					#define   MNoDelFiles        L"\nNo files to delete"
 | 
				
			||||||
#define   MDelFrom           "\nDeleting from %s"
 | 
					#define   MLogTitle          L"--------  %2d %s %d, archive %s"
 | 
				
			||||||
#define   MDeleting          "\nDeleting %s"
 | 
					#define   MPathTooLong       L"\nERROR: Path too long\n"
 | 
				
			||||||
#define   MEraseArc          "\nErasing empty archive %s"
 | 
					#define   MListArchive       L"Archive"
 | 
				
			||||||
#define   MNoDelFiles        "\nNo files to delete"
 | 
					#define   MListDetails       L"Details"
 | 
				
			||||||
#define   MLogTitle          "\n\n--------  %2d %s %d, archive %s\n"
 | 
					#define   MListSolid         L"solid"
 | 
				
			||||||
#define   MPathTooLong       "\nERROR: Path too long\n"
 | 
					#define   MListSFX           L"SFX"
 | 
				
			||||||
#define   MListSolid         "Solid "
 | 
					#define   MListVolume        L"volume"
 | 
				
			||||||
#define   MListSFX           "SFX "
 | 
					#define   MListRR            L"recovery record"
 | 
				
			||||||
#define   MListVol1          "volume"
 | 
					#define   MListLock          L"lock"
 | 
				
			||||||
#define   MListVol2          "Volume"
 | 
					#define   MListEnc           L"encrypted"
 | 
				
			||||||
#define   MListArc1          "archive"
 | 
					#define   MListEncHead       L"encrypted headers"
 | 
				
			||||||
#define   MListArc2          "Archive"
 | 
					#define   MListTitleL        L" Attributes      Size     Date    Time   Name"
 | 
				
			||||||
#define   MListRecRec        "\nRecovery record is present\n"
 | 
					#define   MListTitleV        L" Attributes      Size    Packed Ratio    Date    Time   Checksum  Name"
 | 
				
			||||||
#define   MListLock          "\nLock is present\n"
 | 
					#define   MListName          L"Name"
 | 
				
			||||||
#define   MListPathComm      "\nPathname/Comment\n            "
 | 
					#define   MListType          L"Type"
 | 
				
			||||||
#define   MListName          "\n Name       "
 | 
					#define   MListFile          L"File"
 | 
				
			||||||
#define   MListTitle         "      Size   Packed Ratio  Date   Time     Attr      CRC   Meth Ver\n"
 | 
					#define   MListDir           L"Directory"
 | 
				
			||||||
#define   MListTechTitle     "               Host OS    Solid   Old\n"
 | 
					#define   MListUSymlink      L"Unix symbolic link"
 | 
				
			||||||
#define   MListEAHead        "\n   OS/2 extended attributes"
 | 
					#define   MListWSymlink      L"Windows symbolic link"
 | 
				
			||||||
#define   MListUOHead        "\n   Unix Owner/Group data:    %-14s %-14s"
 | 
					#define   MListJunction      L"NTFS junction point"
 | 
				
			||||||
#define   MListBeEAHead      "\n   BeOS extended attributes"
 | 
					#define   MListHardlink      L"Hard link"
 | 
				
			||||||
#define   MListNTACLHead     "\n   NTFS security data"
 | 
					#define   MListCopy          L"File reference"
 | 
				
			||||||
#define   MListStrmHead      "\n   NTFS stream: %s"
 | 
					#define   MListStream        L"NTFS alternate data stream"
 | 
				
			||||||
#define   MListUnkHead       "\n   Unknown subheader type: 0x%04x"
 | 
					#define   MListTarget        L"Target"
 | 
				
			||||||
#define   MFileComment       "\nComment: "
 | 
					#define   MListSize          L"Size"
 | 
				
			||||||
#define   MYes               "Yes"
 | 
					#define   MListPacked        L"Packed size"
 | 
				
			||||||
#define   MNo                "No"
 | 
					#define   MListRatio         L"Ratio"
 | 
				
			||||||
#define   MListNoFiles       "  0 files\n"
 | 
					#define   MListMtime         L"mtime"
 | 
				
			||||||
#define   MRprReconstr       "\nReconstructing %s"
 | 
					#define   MListCtime         L"ctime"
 | 
				
			||||||
#define   MRprBuild          "\nBuilding %s"
 | 
					#define   MListAtime         L"atime"
 | 
				
			||||||
#define   MRprOldFormat      "\nCannot repair archive with old format"
 | 
					#define   MListAttr          L"Attributes"
 | 
				
			||||||
#define   MRprFind           "\nFound  %s"
 | 
					#define   MListFlags         L"Flags"
 | 
				
			||||||
#define   MRprAskIsSol       "\nThe archive header is corrupt. Mark archive as solid ?"
 | 
					#define   MListCompInfo      L"Compression"
 | 
				
			||||||
#define   MRprNoFiles        "\nNo files found"
 | 
					#define   MListHostOS        L"Host OS"
 | 
				
			||||||
#define   MRprSuspEntry      "\n\nSuspicious entry %s"
 | 
					#define   MListFileVer       L"File version"
 | 
				
			||||||
#define   MRprDir            "\nDirectory"
 | 
					#define   MListService       L"Service"
 | 
				
			||||||
#define   MRprSuspSize       "\nSize %ld  Packed %ld"
 | 
					#define   MListUOHead        L"\n   Unix Owner/Group data:    %-14s %-14s"
 | 
				
			||||||
#define   MRprSuspAdd        "\nAdd it to archive ?"
 | 
					#define   MListNTACLHead     L"\n   NTFS security data"
 | 
				
			||||||
#define   MLogUnexpEOF       "\nUnexpected end of archive"
 | 
					#define   MListStrmHead      L"\n   NTFS stream: %s"
 | 
				
			||||||
#define   MRepAskReconst     "\nReconstruct archive structure ?"
 | 
					#define   MListUnkHead       L"\n   Unknown subheader type: 0x%04x"
 | 
				
			||||||
#define   MRecScanning       "\nScanning..."
 | 
					#define   MFileComment       L"\nComment: "
 | 
				
			||||||
#define   MRecRNotFound      "\nData recovery record not found"
 | 
					#define   MYes               L"Yes"
 | 
				
			||||||
#define   MRecRFound         "\nData recovery record found"
 | 
					#define   MNo                L"No"
 | 
				
			||||||
#define   MRecSecDamage      "\nSector %ld (offsets %lX...%lX) damaged"
 | 
					#define   MListNoFiles       L"  0 files\n"
 | 
				
			||||||
#define   MRecCorrected      " - data recovered"
 | 
					#define   MRprReconstr       L"\nReconstructing %s"
 | 
				
			||||||
#define   MRecFailed         " - cannot recover data"
 | 
					#define   MRprBuild          L"\nBuilding %s"
 | 
				
			||||||
#define   MAddRecRec         "\nAdding data recovery record"
 | 
					#define   MRprOldFormat      L"\nCannot repair archive with old format"
 | 
				
			||||||
#define   MEraseForVolume    "\n\nErasing contents of drive %c:\n"
 | 
					#define   MRprFind           L"\nFound  %s"
 | 
				
			||||||
#define   MGetOwnersError    "\nWARNING: Cannot get %s owner and group\n"
 | 
					#define   MRprAskIsSol       L"\nThe archive header is corrupt. Mark archive as solid ?"
 | 
				
			||||||
#define   MErrGetOwnerID     "\nWARNING: Cannot get owner %s ID\n"
 | 
					#define   MRprNoFiles        L"\nNo files found"
 | 
				
			||||||
#define   MErrGetGroupID     "\nWARNING: Cannot get group %s ID\n"
 | 
					#define   MLogUnexpEOF       L"\nUnexpected end of archive"
 | 
				
			||||||
#define   MOwnersBroken      "\nERROR: %s group and owner data are corrupt\n"
 | 
					#define   MRepAskReconst     L"\nReconstruct archive structure ?"
 | 
				
			||||||
#define   MSetOwnersError    "\nWARNING: Cannot set %s owner and group\n"
 | 
					#define   MRRSearch          L"\nSearching for recovery record"
 | 
				
			||||||
#define   MErrLnkRead        "\nWARNING: Cannot read symbolic link %s"
 | 
					#define   MAnalyzeFileData   L"\nAnalyzing file data"
 | 
				
			||||||
#define   MErrCreateLnk      "\nWARNING: Cannot create link %s"
 | 
					#define   MRecRNotFound      L"\nData recovery record not found"
 | 
				
			||||||
#define   MSymLinkExists     "\nWARNING: Symbolic link %s already exists"
 | 
					#define   MRecRFound         L"\nData recovery record found"
 | 
				
			||||||
#define   MAskRetryCreate    "\nCannot create %s. Retry ?"
 | 
					#define   MRecSecDamage      L"\nSector %ld (offsets %lX...%lX) damaged"
 | 
				
			||||||
#define   MListMACHead1      "\n MacOS file type:  %c%c%c%c  ; "
 | 
					#define   MRecCorrected      L" - data recovered"
 | 
				
			||||||
#define   MListMACHead2      "file creator:  %c%c%c%c\n"
 | 
					#define   MRecFailed         L" - cannot recover data"
 | 
				
			||||||
#define   MDataBadCRC        "\n%-20s : packed data CRC failed in volume %s"
 | 
					#define   MAddRecRec         L"\nAdding data recovery record"
 | 
				
			||||||
#define   MFileRO            "\n%s is read-only"
 | 
					#define   MEraseForVolume    L"\n\nErasing contents of drive %c:\n"
 | 
				
			||||||
#define   MACLGetError       "\nWARNING: Cannot get %s security data\n"
 | 
					#define   MGetOwnersError    L"\nWARNING: Cannot get %s owner and group\n"
 | 
				
			||||||
#define   MACLSetError       "\nWARNING: Cannot set %s security data\n"
 | 
					#define   MErrGetOwnerID     L"\nWARNING: Cannot get owner %s ID\n"
 | 
				
			||||||
#define   MACLBroken         "\nERROR: %s security data are corrupt\n"
 | 
					#define   MErrGetGroupID     L"\nWARNING: Cannot get group %s ID\n"
 | 
				
			||||||
#define   MACLUnknown        "\nWARNING: Unknown format of %s security data\n"
 | 
					#define   MOwnersBroken      L"\nERROR: %s group and owner data are corrupt\n"
 | 
				
			||||||
#define   MStreamBroken      "\nERROR: %s stream data are corrupt\n"
 | 
					#define   MSetOwnersError    L"\nWARNING: Cannot set %s owner and group\n"
 | 
				
			||||||
#define   MStreamUnknown     "\nWARNING: Unknown format of %s stream data\n"
 | 
					#define   MErrLnkRead        L"\nWARNING: Cannot read symbolic link %s"
 | 
				
			||||||
#define   MInvalidName       "\nERROR: Invalid file name %s"
 | 
					#define   MSymLinkExists     L"\nWARNING: Symbolic link %s already exists"
 | 
				
			||||||
#define   MEABroken          "\nERROR: %s extended attributes are corrupt\n"
 | 
					#define   MAskRetryCreate    L"\nCannot create %s. Retry ?"
 | 
				
			||||||
#define   MEAUnknHeader      "\nWARNING: %s - unknown format of extended attributes\n"
 | 
					#define   MDataBadCRC        L"\n%-20s : packed data checksum error in volume %s"
 | 
				
			||||||
#define   MCannotSetEA       "\nWARNING: cannot set extended attributes to %s\n"
 | 
					#define   MFileRO            L"\n%s is read-only"
 | 
				
			||||||
#define   MCannotGetEA       "\nERROR: Cannot get extended attributes of %s\n"
 | 
					#define   MACLGetError       L"\nWARNING: Cannot get %s security data\n"
 | 
				
			||||||
#define   MShowEA            " (+EA)"
 | 
					#define   MACLSetError       L"\nWARNING: Cannot set %s security data\n"
 | 
				
			||||||
#define   MSkipEA            "\n...skipping extended attributes"
 | 
					#define   MACLBroken         L"\nERROR: %s security data are corrupt\n"
 | 
				
			||||||
#define   MProcessArc        "\n\nProcessing archive %s"
 | 
					#define   MACLUnknown        L"\nWARNING: Unknown format of %s security data\n"
 | 
				
			||||||
#define   MSyncScanError     "\nFile search errors, cannot synchronize archive"
 | 
					#define   MStreamBroken      L"\nERROR: %s stream data are corrupt\n"
 | 
				
			||||||
#define   MCorrectingName    "\nWARNING: Attempting to correct the invalid file name"
 | 
					#define   MStreamUnknown     L"\nWARNING: Unknown format of %s stream data\n"
 | 
				
			||||||
#define   MUnpCannotMerge    "\nWARNING: You need to start extraction from a previous volume to unpack %s"
 | 
					#define   MInvalidName       L"\nERROR: Invalid file name %s"
 | 
				
			||||||
#define   MUnknownOption     "\nERROR: Unknown option: %s"
 | 
					#define   MProcessArc        L"\n\nProcessing archive %s"
 | 
				
			||||||
#define   MSubHeadCorrupt    "\nERROR: Corrupt data header found, ignored"
 | 
					#define   MCorrectingName    L"\nWARNING: Attempting to correct the invalid file name"
 | 
				
			||||||
#define   MSubHeadUnknown    "\nWARNING: Unknown data header format, ignored"
 | 
					#define   MUnpCannotMerge    L"\nWARNING: You need to start extraction from a previous volume to unpack %s"
 | 
				
			||||||
#define   MSubHeadDataCRC    "\nERROR: Corrupt %s data block"
 | 
					#define   MUnknownOption     L"\nERROR: Unknown option: %s"
 | 
				
			||||||
#define   MSubHeadType       "\nData header type: %s"
 | 
					#define   MSubHeadCorrupt    L"\nERROR: Corrupt data header found, ignored"
 | 
				
			||||||
#define   MScanError         "\nCannot read contents of %s"
 | 
					#define   MSubHeadUnknown    L"\nWARNING: Unknown data header format, ignored"
 | 
				
			||||||
#define   MNotVolume         "\n%s is not volume"
 | 
					#define   MSubHeadDataCRC    L"\nERROR: Corrupt %s data block"
 | 
				
			||||||
#define   MRecVolDiffSets    "\nERROR: %s and %s belong to different sets"
 | 
					#define   MSubHeadType       L"\nData header type: %s"
 | 
				
			||||||
#define   MRecVolMissing     "\n%d volumes missing"
 | 
					#define   MScanError         L"\nCannot read contents of %s"
 | 
				
			||||||
#define   MRecVolFound       "\n%d recovery volumes found"
 | 
					#define   MNotVolume         L"\n%s is not volume"
 | 
				
			||||||
#define   MRecVolAllExist    "\nNothing to reconstruct"
 | 
					#define   MRecVolDiffSets    L"\nERROR: %s and %s belong to different sets"
 | 
				
			||||||
#define   MRecVolCannotFix   "\nReconstruction impossible"
 | 
					#define   MRecVolMissing     L"\n%d volumes missing"
 | 
				
			||||||
#define   MReconstructing    "\nReconstructing..."
 | 
					#define   MRecVolFound       L"\n%d recovery volumes found"
 | 
				
			||||||
#define   MCreating          "\nCreating %s"
 | 
					#define   MRecVolAllExist    L"\nNothing to reconstruct"
 | 
				
			||||||
#define   MRenaming          "\nRenaming %s to %s"
 | 
					#define   MRecVolCannotFix   L"\nReconstruction impossible"
 | 
				
			||||||
#define   MNTFSRequired      "\nWrite error: only NTFS file system supports files larger than 4 GB"
 | 
					#define   MReconstructing    L"\nReconstructing..."
 | 
				
			||||||
#define   MErrChangeAttr     "\nWARNING: Cannot change attributes of %s"
 | 
					#define   MCreating          L"\nCreating %s"
 | 
				
			||||||
#define   MWrongSFXVer       "\nERROR: default SFX module does not support RAR %d.%d archives"
 | 
					#define   MRenaming          L"\nRenaming %s to %s"
 | 
				
			||||||
#define   MCannotEncName     "\nCannot encrypt archive already contained encrypted files"
 | 
					#define   MNTFSRequired      L"\nWrite error: only NTFS file system supports files larger than 4 GB"
 | 
				
			||||||
#define   MCannotEmail       "\nCannot email the file %s"
 | 
					#define   MFAT32Size         L"\nWARNING: FAT32 file system does not support 4 GB or larger files"
 | 
				
			||||||
#define   MCopyrightS        "\nRAR SFX archive" 
 | 
					#define   MErrChangeAttr     L"\nWARNING: Cannot change attributes of %s"
 | 
				
			||||||
#define   MSHelpCmd          "\n\n<Commands>" 
 | 
					#define   MWrongSFXVer       L"\nERROR: default SFX module does not support RAR %d.%d archives"
 | 
				
			||||||
#define   MSHelpCmdE         "\n  -x      Extract from archive (default)" 
 | 
					#define   MHeadEncMismatch   L"\nCannot change the header encryption mode in already encrypted archive"
 | 
				
			||||||
#define   MSHelpCmdT         "\n  -t      Test archive files" 
 | 
					#define   MCannotEmail       L"\nCannot email the file %s"
 | 
				
			||||||
#define   MSHelpCmdV         "\n  -v      Verbosely list contents of archive" 
 | 
					#define   MCopyrightS        L"\nRAR SFX archive" 
 | 
				
			||||||
#define   MMaxPathLimit      "\nTotal path and file name length must not exceed %d characters"
 | 
					#define   MSHelpCmd          L"\n\n<Commands>" 
 | 
				
			||||||
#define   MRecVolLimit       "\nTotal number of usual and recovery volumes must not exceed 255"
 | 
					#define   MSHelpCmdE         L"\n  -x      Extract from archive (default)" 
 | 
				
			||||||
#define   MVolumeNumber      "volume %d"
 | 
					#define   MSHelpCmdT         L"\n  -t      Test archive files" 
 | 
				
			||||||
#define   MCannotDelete      "\nCannot delete %s"
 | 
					#define   MSHelpCmdV         L"\n  -v      Verbosely list contents of archive" 
 | 
				
			||||||
#define   MCalcCRC           "\nCalculating the control sum"
 | 
					#define   MRecVolLimit       L"\nTotal number of usual and recovery volumes must not exceed %d"
 | 
				
			||||||
#define   MTooLargeSFXArc    "\nWARNING: Too large SFX archive. Windows cannot run the executable file exceeding 4 GB."
 | 
					#define   MVolumeNumber      L"volume %d"
 | 
				
			||||||
#define   MCalcCRCAllVol     "\nCalculating control sums of all volumes."
 | 
					#define   MCannotDelete      L"\nCannot delete %s"
 | 
				
			||||||
#define   MNotEnoughDisk     "\nERROR: Not enough disk space for %s."
 | 
					#define   MRecycleFailed     L"\nCannot move some files and folders to Recycle Bin"
 | 
				
			||||||
 | 
					#define   MCalcCRC           L"\nCalculating the checksum"
 | 
				
			||||||
 | 
					#define   MTooLargeSFXArc    L"\nToo large SFX archive. Windows cannot run the executable file exceeding 4 GB."
 | 
				
			||||||
 | 
					#define   MCalcCRCAllVol     L"\nCalculating checksums of all volumes."
 | 
				
			||||||
 | 
					#define   MNotEnoughDisk     L"\nERROR: Not enough disk space for %s."
 | 
				
			||||||
 | 
					#define   MNewerRAR          L"\nYou may need a newer version of RAR."
 | 
				
			||||||
 | 
					#define   MUnkEncMethod      L"\nUnknown encryption method in %s"
 | 
				
			||||||
 | 
					#define   MWrongPassword     L"\nThe specified password is incorrect."
 | 
				
			||||||
 | 
					#define   MWrongFilePassword L"\nIncorrect password for %s"
 | 
				
			||||||
 | 
					#define   MAreaDamaged       L"\nCorrupt %d bytes at %08x %08x"
 | 
				
			||||||
 | 
					#define   MBlocksRecovered   L"\n%u blocks are recovered, %u blocks are relocated"
 | 
				
			||||||
 | 
					#define   MRRDamaged         L"\nRecovery record is corrupt."
 | 
				
			||||||
 | 
					#define   MTestingRR         L"\nTesting the recovery record"
 | 
				
			||||||
 | 
					#define   MFailed            L"Failed"
 | 
				
			||||||
 | 
					#define   MIncompatSwitch    L"\n%s switch is not supported for RAR %d.x archive format."
 | 
				
			||||||
 | 
					#define   MSearchDupFiles    L"\nSearching for identical files"
 | 
				
			||||||
 | 
					#define   MNumFound          L"%d found."
 | 
				
			||||||
 | 
					#define   MUnknownExtra      L"\nUnknown extra field in %s."
 | 
				
			||||||
 | 
					#define   MCorruptExtra      L"\nCorrupt %s extra field in %s."
 | 
				
			||||||
 | 
					#define   MCopyError         L"\nCannot copy %s to %s."
 | 
				
			||||||
 | 
					#define   MCopyErrorHint     L"\nYou need to unpack the entire archive to create file reference entries."
 | 
				
			||||||
 | 
					#define   MCopyingData       L"\nCopying data"
 | 
				
			||||||
 | 
					#define   MErrCreateLnkS     L"\nCannot create symbolic link %s"
 | 
				
			||||||
 | 
					#define   MErrCreateLnkH     L"\nCannot create hard link %s"
 | 
				
			||||||
 | 
					#define   MErrLnkTarget      L"\nYou need to unpack the link target first"
 | 
				
			||||||
 | 
					#define   MNeedAdmin         L"\nYou may need to run RAR as administrator"
 | 
				
			||||||
 | 
					#define   MDictOutMem        L"\nNot enough memory for %d MB compression dictionary, changed to %d MB."
 | 
				
			||||||
 | 
					#define   MUseSmalllerDict   L"\nPlease use a smaller compression dictionary."
 | 
				
			||||||
 | 
					#define   MOpenErrAtime      L"\nYou may need to remove -tsp switch to open this file."
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,36 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char LogName[NM];
 | 
					static wchar LogName[NM];
 | 
				
			||||||
 | 
					static RAR_CHARSET LogCharset=RCH_DEFAULT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void InitLogOptions(char *LogName)
 | 
					void InitLogOptions(const wchar *LogFileName,RAR_CHARSET CSet)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  strcpy(::LogName,LogName);
 | 
					  wcsncpyz(LogName,LogFileName,ASIZE(LogName));
 | 
				
			||||||
 | 
					  LogCharset=CSet;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SILENT
 | 
					#ifndef SILENT
 | 
				
			||||||
void Log(const char *ArcName,const char *Format,...)
 | 
					void Log(const wchar *ArcName,const wchar *fmt,...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  safebuf char Msg[2*NM+1024];
 | 
					  // Preserve the error code for possible following system error message.
 | 
				
			||||||
  va_list ArgPtr;
 | 
					  int Code=ErrHandler.GetSystemErrorCode();
 | 
				
			||||||
  va_start(ArgPtr,Format);
 | 
					
 | 
				
			||||||
  vsprintf(Msg,Format,ArgPtr);
 | 
					  uiAlarm(UIALARM_ERROR);
 | 
				
			||||||
  va_end(ArgPtr);
 | 
					
 | 
				
			||||||
  eprintf("%s",Msg);
 | 
					  // This buffer is for format string only, not for entire output,
 | 
				
			||||||
 | 
					  // so it can be short enough.
 | 
				
			||||||
 | 
					  wchar fmtw[1024];
 | 
				
			||||||
 | 
					  PrintfPrepareFmt(fmt,fmtw,ASIZE(fmtw));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  safebuf wchar Msg[2*NM+1024];
 | 
				
			||||||
 | 
					  va_list arglist;
 | 
				
			||||||
 | 
					  va_start(arglist,fmt);
 | 
				
			||||||
 | 
					  vswprintf(Msg,ASIZE(Msg),fmtw,arglist);
 | 
				
			||||||
 | 
					  va_end(arglist);
 | 
				
			||||||
 | 
					  eprintf(L"%ls",Msg);
 | 
				
			||||||
 | 
					  ErrHandler.SetSystemErrorCode(Code);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,12 @@
 | 
				
			||||||
#ifndef _RAR_LOG_
 | 
					#ifndef _RAR_LOG_
 | 
				
			||||||
#define _RAR_LOG_
 | 
					#define _RAR_LOG_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void InitLogOptions(char *LogName);
 | 
					void InitLogOptions(const wchar *LogFileName,RAR_CHARSET CSet);
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SILENT
 | 
					 | 
				
			||||||
void Log(const char *ArcName,const char *Format,...);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef SILENT
 | 
					#ifdef SILENT
 | 
				
			||||||
#ifdef __GNUC__
 | 
					inline void Log(const wchar *ArcName,const wchar *fmt,...) {}
 | 
				
			||||||
#define Log(args...)
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
inline void Log(const char *a,const char *b,const char *c=NULL,const char *d=NULL) {}
 | 
					void Log(const wchar *ArcName,const wchar *fmt,...);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,15 +1,14 @@
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Makefile for UNIX - unrar
 | 
					# Makefile for UNIX - unrar
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Note: you have to 'make clean' before you can build
 | 
					 | 
				
			||||||
#	the sfx module
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Linux using GCC
 | 
					# Linux using GCC
 | 
				
			||||||
#CXX=g++
 | 
					CXX=c++
 | 
				
			||||||
#CXXFLAGS=-O2
 | 
					CXXFLAGS=-O2 -Wno-logical-op-parentheses -Wno-switch -Wno-dangling-else
 | 
				
			||||||
DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DGUI -DSILENT
 | 
					LIBFLAGS=-fPIC
 | 
				
			||||||
 | 
					DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DRAR_SMP
 | 
				
			||||||
STRIP=strip
 | 
					STRIP=strip
 | 
				
			||||||
 | 
					AR=ar
 | 
				
			||||||
 | 
					LDFLAGS=-pthread
 | 
				
			||||||
DESTDIR=/usr
 | 
					DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Linux using LCC
 | 
					# Linux using LCC
 | 
				
			||||||
| 
						 | 
					@ -17,6 +16,17 @@ DESTDIR=/usr
 | 
				
			||||||
#CXXFLAGS=-O2
 | 
					#CXXFLAGS=-O2
 | 
				
			||||||
#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
					#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# CYGWIN using GCC
 | 
				
			||||||
 | 
					#CXX=c++
 | 
				
			||||||
 | 
					#CXXFLAGS=-O2
 | 
				
			||||||
 | 
					#LIBFLAGS=
 | 
				
			||||||
 | 
					#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DRAR_SMP
 | 
				
			||||||
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
 | 
					#LDFLAGS=-pthread
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# HP UX using aCC
 | 
					# HP UX using aCC
 | 
				
			||||||
| 
						 | 
					@ -24,6 +34,7 @@ DESTDIR=/usr
 | 
				
			||||||
#CXXFLAGS=-AA +O2 +Onolimit
 | 
					#CXXFLAGS=-AA +O2 +Onolimit
 | 
				
			||||||
#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
					#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# IRIX using GCC
 | 
					# IRIX using GCC
 | 
				
			||||||
| 
						 | 
					@ -31,6 +42,7 @@ DESTDIR=/usr
 | 
				
			||||||
#CXXFLAGS=-O2 
 | 
					#CXXFLAGS=-O2 
 | 
				
			||||||
#DEFINES=-DBIG_ENDIAN -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_BSD_COMPAT -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1
 | 
					#DEFINES=-DBIG_ENDIAN -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_BSD_COMPAT -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# IRIX using MIPSPro (experimental)
 | 
					# IRIX using MIPSPro (experimental)
 | 
				
			||||||
| 
						 | 
					@ -38,6 +50,7 @@ DESTDIR=/usr
 | 
				
			||||||
#CXXFLAGS=-O2 -mips3 -woff 1234,1156,3284 -LANG:std
 | 
					#CXXFLAGS=-O2 -mips3 -woff 1234,1156,3284 -LANG:std
 | 
				
			||||||
#DEFINES=-DBIG_ENDIAN -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_BSD_COMPAT -Dint64=int64_t
 | 
					#DEFINES=-DBIG_ENDIAN -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_BSD_COMPAT -Dint64=int64_t
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# AIX using xlC (IBM VisualAge C++ 5.0)
 | 
					# AIX using xlC (IBM VisualAge C++ 5.0)
 | 
				
			||||||
| 
						 | 
					@ -46,6 +59,7 @@ DESTDIR=/usr
 | 
				
			||||||
#DEFINES=-D_LARGE_FILES -D_LARGE_FILE_API
 | 
					#DEFINES=-D_LARGE_FILES -D_LARGE_FILE_API
 | 
				
			||||||
#LIBS=-lbsd
 | 
					#LIBS=-lbsd
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Solaris using CC
 | 
					# Solaris using CC
 | 
				
			||||||
| 
						 | 
					@ -53,6 +67,7 @@ DESTDIR=/usr
 | 
				
			||||||
#CXXFLAGS=-fast -erroff=wvarhidemem
 | 
					#CXXFLAGS=-fast -erroff=wvarhidemem
 | 
				
			||||||
#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
					#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Solaris using GCC (optimized for UltraSPARC 1 CPU)
 | 
					# Solaris using GCC (optimized for UltraSPARC 1 CPU)
 | 
				
			||||||
| 
						 | 
					@ -60,12 +75,14 @@ DESTDIR=/usr
 | 
				
			||||||
#CXXFLAGS=-O3 -mcpu=v9 -mtune=ultrasparc -m32
 | 
					#CXXFLAGS=-O3 -mcpu=v9 -mtune=ultrasparc -m32
 | 
				
			||||||
#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
					#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
				
			||||||
#STRIP=/usr/ccs/bin/strip
 | 
					#STRIP=/usr/ccs/bin/strip
 | 
				
			||||||
 | 
					#AR=/usr/ccs/bin/ar
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Tru64 5.1B using GCC3
 | 
					# Tru64 5.1B using GCC3
 | 
				
			||||||
#CXX=g++
 | 
					#CXX=g++
 | 
				
			||||||
#CXXFLAGS=-O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_XOPEN_SOURCE=500
 | 
					#CXXFLAGS=-O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_XOPEN_SOURCE=500
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#LDFLAGS=-rpath /usr/local/gcc/lib
 | 
					#LDFLAGS=-rpath /usr/local/gcc/lib
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,6 +90,7 @@ DESTDIR=/usr
 | 
				
			||||||
#CXX=cxx
 | 
					#CXX=cxx
 | 
				
			||||||
#CXXFLAGS=-O4 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dint64=long
 | 
					#CXXFLAGS=-O4 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dint64=long
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#LDFLAGS=
 | 
					#LDFLAGS=
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,6 +98,7 @@ DESTDIR=/usr
 | 
				
			||||||
#CXX=g++
 | 
					#CXX=g++
 | 
				
			||||||
#CXXFLAGS=-O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fexceptions
 | 
					#CXXFLAGS=-O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fexceptions
 | 
				
			||||||
#STRIP=strip
 | 
					#STRIP=strip
 | 
				
			||||||
 | 
					#AR=ar
 | 
				
			||||||
#LDFLAGS=-fexceptions
 | 
					#LDFLAGS=-fexceptions
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,6 +108,7 @@ DESTDIR=/usr
 | 
				
			||||||
#CXXFLAGS=-O2
 | 
					#CXXFLAGS=-O2
 | 
				
			||||||
#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
					#DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
				
			||||||
#STRIP=arm-linux-strip
 | 
					#STRIP=arm-linux-strip
 | 
				
			||||||
 | 
					#AR=arm-linux-ar
 | 
				
			||||||
#LDFLAGS=-static
 | 
					#LDFLAGS=-static
 | 
				
			||||||
#DESTDIR=/usr
 | 
					#DESTDIR=/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,13 +119,14 @@ LINK=$(CXX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WHAT=UNRAR
 | 
					WHAT=UNRAR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UNRAR_OBJ=filestr.o recvol.o rs.o scantree.o
 | 
					UNRAR_OBJ=filestr.o recvol.o rs.o scantree.o qopen.o
 | 
				
			||||||
LIB_OBJ=filestr.o scantree.o dll.o
 | 
					LIB_OBJ=filestr.o scantree.o dll.o qopen.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OBJECTS=rar.o strlist.o strfn.o pathfn.o savepos.o smallfn.o global.o file.o filefn.o filcreat.o \
 | 
					OBJECTS=rar.o strlist.o strfn.o pathfn.o smallfn.o global.o file.o filefn.o filcreat.o \
 | 
				
			||||||
	archive.o arcread.o unicode.o system.o isnt.o crypt.o crc.o rawread.o encname.o \
 | 
						archive.o arcread.o unicode.o system.o isnt.o crypt.o crc.o rawread.o encname.o \
 | 
				
			||||||
	resource.o match.o timefn.o rdwrfn.o consio.o options.o ulinks.o errhnd.o rarvm.o \
 | 
						resource.o match.o timefn.o rdwrfn.o consio.o options.o errhnd.o rarvm.o secpassword.o \
 | 
				
			||||||
	rijndael.o getbits.o sha1.o extinfo.o extract.o volume.o list.o find.o unpack.o cmddata.o
 | 
						rijndael.o getbits.o sha1.o sha256.o blake2s.o hash.o extinfo.o extract.o volume.o \
 | 
				
			||||||
 | 
					  list.o find.o unpack.o headers.o threadpool.o rs16.o cmddata.o ui.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.cpp.o:
 | 
					.cpp.o:
 | 
				
			||||||
	$(COMPILE) -D$(WHAT) -c $<
 | 
						$(COMPILE) -D$(WHAT) -c $<
 | 
				
			||||||
| 
						 | 
					@ -117,32 +138,37 @@ install:	install-unrar
 | 
				
			||||||
uninstall:	uninstall-unrar
 | 
					uninstall:	uninstall-unrar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
	@rm -f *.o *.bak *~
 | 
						@rm -f *.bak *~
 | 
				
			||||||
 | 
						@rm -f $(OBJECTS) $(UNRAR_OBJ) $(LIB_OBJ)
 | 
				
			||||||
 | 
						@rm -f unrar libunrar.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unrar:	$(OBJECTS) $(UNRAR_OBJ)
 | 
					unrar:	clean $(OBJECTS) $(UNRAR_OBJ)
 | 
				
			||||||
	@rm -f unrar
 | 
						@rm -f unrar
 | 
				
			||||||
	$(LINK) -o unrar $(LDFLAGS) $(OBJECTS) $(UNRAR_OBJ) $(LIBS)	
 | 
						$(LINK) -o unrar $(LDFLAGS) $(OBJECTS) $(UNRAR_OBJ) $(LIBS)	
 | 
				
			||||||
	$(STRIP) unrar
 | 
						$(STRIP) unrar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sfx:	WHAT=SFX_MODULE
 | 
					sfx:	WHAT=SFX_MODULE
 | 
				
			||||||
sfx:	$(OBJECTS)
 | 
					sfx:	clean $(OBJECTS)
 | 
				
			||||||
	@rm -f default.sfx
 | 
						@rm -f default.sfx
 | 
				
			||||||
	$(LINK) -o default.sfx $(LDFLAGS) $(OBJECTS)
 | 
						$(LINK) -o default.sfx $(LDFLAGS) $(OBJECTS)
 | 
				
			||||||
	$(STRIP) default.sfx
 | 
						$(STRIP) default.sfx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lib:	WHAT=RARDLL
 | 
					lib:	WHAT=RARDLL
 | 
				
			||||||
lib:	$(OBJECTS) $(LIB_OBJ)
 | 
					lib:	CXXFLAGS+=$(LIBFLAGS)
 | 
				
			||||||
	@rm -f libunrar.so
 | 
					lib:	clean $(OBJECTS) $(LIB_OBJ)
 | 
				
			||||||
 | 
						@rm -f libunrar.*
 | 
				
			||||||
	$(LINK) -shared -o libunrar.so $(LDFLAGS) $(OBJECTS) $(LIB_OBJ)
 | 
						$(LINK) -shared -o libunrar.so $(LDFLAGS) $(OBJECTS) $(LIB_OBJ)
 | 
				
			||||||
 | 
						$(AR) rcs libunrar.a $(OBJECTS) $(LIB_OBJ)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install-unrar:
 | 
					install-unrar:
 | 
				
			||||||
			install unrar $(DESTDIR)/bin
 | 
								install -D unrar $(DESTDIR)/bin/unrar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uninstall-unrar:
 | 
					uninstall-unrar:
 | 
				
			||||||
			rm -f $(DESTDIR)/bin/unrar
 | 
								rm -f $(DESTDIR)/bin/unrar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install-lib:
 | 
					install-lib:
 | 
				
			||||||
		install libunrar.so $(DESTDIR)/lib
 | 
							install libunrar.so $(DESTDIR)/lib
 | 
				
			||||||
 | 
							install libunrar.a $(DESTDIR)/lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uninstall-lib:
 | 
					uninstall-lib:
 | 
				
			||||||
		rm -f $(DESTDIR)/lib/libunrar.so
 | 
							rm -f $(DESTDIR)/lib/libunrar.so
 | 
				
			||||||
| 
						 | 
					@ -1,501 +0,0 @@
 | 
				
			||||||
.AUTODEPEND
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
basepath    = $(BASEPATHCC)
 | 
					 | 
				
			||||||
binpath     = $(basepath)\bin
 | 
					 | 
				
			||||||
libpath     = $(basepath)\lib
 | 
					 | 
				
			||||||
rarpath     = .
 | 
					 | 
				
			||||||
incpath     = $(basepath)\include;$(rarpath)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cc    = $(binpath)\bcc32
 | 
					 | 
				
			||||||
link  = $(binpath)\ilink32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
objpath     = .
 | 
					 | 
				
			||||||
guiopt      = -WC -H=$(objpath)\rar.csm
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifndef RARDLL
 | 
					 | 
				
			||||||
!ifndef GUI
 | 
					 | 
				
			||||||
guiopt=$(guiopt) -x-
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
!ifdef SFX_MODULE
 | 
					 | 
				
			||||||
guiopt=$(guiopt) -x-
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifdef DEBUG
 | 
					 | 
				
			||||||
optdeb=-Od -k -vi- -DDEBUG
 | 
					 | 
				
			||||||
!else
 | 
					 | 
				
			||||||
# -O is not safe to use with -pr and int64 return values, so let's turn it off
 | 
					 | 
				
			||||||
optdeb=-O1 -O- -k-
 | 
					 | 
				
			||||||
#optdeb=-Ob -Oe -Og -Oi -Ol -Om -Op -OS -Ov -Z -Oc
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
optunrar=-DUNRAR
 | 
					 | 
				
			||||||
linkdest=unrar.exe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifdef SFX_MODULE
 | 
					 | 
				
			||||||
optunrar=-DUNRAR -DSFX_MODULE
 | 
					 | 
				
			||||||
linkdest=sfx.exe
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
linkopt = -L$(libpath) -ap -c -v -s -V4.0 -Gn
 | 
					 | 
				
			||||||
compopt = -P -c -I$(incpath) -R -v -vi -w-pch -w-par -K -f-\
 | 
					 | 
				
			||||||
          -ff- -a4 -pr -RT- $(optdeb) $(guiopt) $(optunrar) -d -w-8072
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifdef RARDLL
 | 
					 | 
				
			||||||
SILENT=true
 | 
					 | 
				
			||||||
linkdest=unrar.dll
 | 
					 | 
				
			||||||
linkopt=$(linkopt) -Tpd
 | 
					 | 
				
			||||||
compopt=$(compopt) -DRARDLL
 | 
					 | 
				
			||||||
!else
 | 
					 | 
				
			||||||
linkopt=$(linkopt) -Tpe -B:0x400000 
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifdef SILENT
 | 
					 | 
				
			||||||
compopt=$(compopt) -DSILENT
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rar: $(linkdest)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dep_SFX= \
 | 
					 | 
				
			||||||
   $(objpath)\strlist.obj\
 | 
					 | 
				
			||||||
   $(objpath)\strfn.obj\
 | 
					 | 
				
			||||||
   $(objpath)\pathfn.obj\
 | 
					 | 
				
			||||||
   $(objpath)\cmddata.obj\
 | 
					 | 
				
			||||||
   $(objpath)\consio.obj\
 | 
					 | 
				
			||||||
   $(objpath)\savepos.obj\
 | 
					 | 
				
			||||||
   $(objpath)\smallfn.obj\
 | 
					 | 
				
			||||||
   $(objpath)\file.obj\
 | 
					 | 
				
			||||||
   $(objpath)\filefn.obj\
 | 
					 | 
				
			||||||
   $(objpath)\filcreat.obj\
 | 
					 | 
				
			||||||
   $(objpath)\sha1.obj\
 | 
					 | 
				
			||||||
   $(objpath)\archive.obj\
 | 
					 | 
				
			||||||
   $(objpath)\arcread.obj\
 | 
					 | 
				
			||||||
   $(objpath)\unicode.obj\
 | 
					 | 
				
			||||||
   $(objpath)\system.obj\
 | 
					 | 
				
			||||||
   $(objpath)\isnt.obj\
 | 
					 | 
				
			||||||
   $(objpath)\crc.obj\
 | 
					 | 
				
			||||||
   $(objpath)\crypt.obj\
 | 
					 | 
				
			||||||
   $(objpath)\rijndael.obj\
 | 
					 | 
				
			||||||
   $(objpath)\rawread.obj\
 | 
					 | 
				
			||||||
   $(objpath)\encname.obj\
 | 
					 | 
				
			||||||
   $(objpath)\resource.obj\
 | 
					 | 
				
			||||||
   $(objpath)\match.obj\
 | 
					 | 
				
			||||||
   $(objpath)\find.obj\
 | 
					 | 
				
			||||||
   $(objpath)\timefn.obj\
 | 
					 | 
				
			||||||
   $(objpath)\getbits.obj\
 | 
					 | 
				
			||||||
   $(objpath)\rarvm.obj\
 | 
					 | 
				
			||||||
   $(objpath)\rdwrfn.obj\
 | 
					 | 
				
			||||||
   $(objpath)\options.obj\
 | 
					 | 
				
			||||||
   $(objpath)\ulinks.obj\
 | 
					 | 
				
			||||||
   $(objpath)\errhnd.obj\
 | 
					 | 
				
			||||||
   $(objpath)\volume.obj\
 | 
					 | 
				
			||||||
   $(objpath)\rs.obj\
 | 
					 | 
				
			||||||
   $(objpath)\recvol.obj\
 | 
					 | 
				
			||||||
   $(objpath)\extinfo.obj\
 | 
					 | 
				
			||||||
   $(objpath)\extract.obj\
 | 
					 | 
				
			||||||
   $(objpath)\unpack.obj\
 | 
					 | 
				
			||||||
   $(objpath)\rar.obj\
 | 
					 | 
				
			||||||
   $(objpath)\global.obj
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dep_Unrar = \
 | 
					 | 
				
			||||||
   $(objpath)\filestr.obj\
 | 
					 | 
				
			||||||
   $(objpath)\scantree.obj
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dep_Dll = \
 | 
					 | 
				
			||||||
   $(objpath)\dll.obj
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#Dep_SFXOnly = $(objpath)\rtl.obj
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifndef GUI
 | 
					 | 
				
			||||||
!ifndef SILENT
 | 
					 | 
				
			||||||
Dep_Console = \
 | 
					 | 
				
			||||||
   $(objpath)\list.obj
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifdef SFX_MODULE
 | 
					 | 
				
			||||||
Dep = $(Dep_SFX) $(Dep_SFXOnly)
 | 
					 | 
				
			||||||
!else
 | 
					 | 
				
			||||||
Dep = $(Dep_SFX) $(Dep_Unrar)
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifndef GUI
 | 
					 | 
				
			||||||
Dep = $(Dep) $(Dep_Console)
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifdef RARDLL
 | 
					 | 
				
			||||||
Dep = $(Dep) $(Dep_Dll)
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ifdef GUI
 | 
					 | 
				
			||||||
$(linkdest) : $(Dep)
 | 
					 | 
				
			||||||
  echo Done
 | 
					 | 
				
			||||||
!else
 | 
					 | 
				
			||||||
$(linkdest) : $(Dep)
 | 
					 | 
				
			||||||
  $(link) @&&|
 | 
					 | 
				
			||||||
 $(linkopt) +
 | 
					 | 
				
			||||||
#!ifdef SFX_MODULE
 | 
					 | 
				
			||||||
#$(objpath)\dummy.obj+
 | 
					 | 
				
			||||||
#$(objpath)\ll.obj+
 | 
					 | 
				
			||||||
#$(objpath)\rtl.obj+
 | 
					 | 
				
			||||||
#!else
 | 
					 | 
				
			||||||
!ifdef RARDLL
 | 
					 | 
				
			||||||
$(libpath)\c0d32.obj+
 | 
					 | 
				
			||||||
!else
 | 
					 | 
				
			||||||
$(libpath)\c0x32.obj+
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
#!endif
 | 
					 | 
				
			||||||
$(objpath)\strlist.obj+
 | 
					 | 
				
			||||||
$(objpath)\strfn.obj+
 | 
					 | 
				
			||||||
$(objpath)\pathfn.obj+
 | 
					 | 
				
			||||||
$(objpath)\savepos.obj+
 | 
					 | 
				
			||||||
$(objpath)\smallfn.obj+
 | 
					 | 
				
			||||||
$(objpath)\global.obj+
 | 
					 | 
				
			||||||
$(objpath)\file.obj+
 | 
					 | 
				
			||||||
$(objpath)\filefn.obj+
 | 
					 | 
				
			||||||
$(objpath)\filcreat.obj+
 | 
					 | 
				
			||||||
$(objpath)\sha1.obj+
 | 
					 | 
				
			||||||
$(objpath)\archive.obj+
 | 
					 | 
				
			||||||
$(objpath)\arcread.obj+
 | 
					 | 
				
			||||||
$(objpath)\unicode.obj+
 | 
					 | 
				
			||||||
$(objpath)\system.obj+
 | 
					 | 
				
			||||||
$(objpath)\isnt.obj+
 | 
					 | 
				
			||||||
$(objpath)\crc.obj+
 | 
					 | 
				
			||||||
$(objpath)\crypt.obj+
 | 
					 | 
				
			||||||
$(objpath)\rijndael.obj+
 | 
					 | 
				
			||||||
$(objpath)\rawread.obj+
 | 
					 | 
				
			||||||
$(objpath)\encname.obj+
 | 
					 | 
				
			||||||
$(objpath)\resource.obj+
 | 
					 | 
				
			||||||
$(objpath)\match.obj+
 | 
					 | 
				
			||||||
$(objpath)\find.obj+
 | 
					 | 
				
			||||||
!ifndef SFX_MODULE
 | 
					 | 
				
			||||||
$(objpath)\filestr.obj+
 | 
					 | 
				
			||||||
$(objpath)\scantree.obj+
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
$(objpath)\timefn.obj+
 | 
					 | 
				
			||||||
$(objpath)\getbits.obj+
 | 
					 | 
				
			||||||
$(objpath)\rarvm.obj+
 | 
					 | 
				
			||||||
$(objpath)\rdwrfn.obj+
 | 
					 | 
				
			||||||
$(objpath)\consio.obj+
 | 
					 | 
				
			||||||
$(objpath)\cmddata.obj+
 | 
					 | 
				
			||||||
$(objpath)\options.obj+
 | 
					 | 
				
			||||||
$(objpath)\ulinks.obj+
 | 
					 | 
				
			||||||
$(objpath)\volume.obj+
 | 
					 | 
				
			||||||
$(objpath)\extinfo.obj+
 | 
					 | 
				
			||||||
$(objpath)\extract.obj+
 | 
					 | 
				
			||||||
$(objpath)\rs.obj+
 | 
					 | 
				
			||||||
$(objpath)\recvol.obj+
 | 
					 | 
				
			||||||
!ifndef SILENT
 | 
					 | 
				
			||||||
!ifndef GUI
 | 
					 | 
				
			||||||
$(objpath)\list.obj+
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
!ifdef RARDLL
 | 
					 | 
				
			||||||
$(objpath)\dll.obj+
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
$(objpath)\errhnd.obj+
 | 
					 | 
				
			||||||
$(objpath)\unpack.obj+
 | 
					 | 
				
			||||||
$(objpath)\rar.obj
 | 
					 | 
				
			||||||
$<,$*
 | 
					 | 
				
			||||||
$(libpath)\cw32.lib+
 | 
					 | 
				
			||||||
$(libpath)\import32.lib
 | 
					 | 
				
			||||||
!ifdef RARDLL
 | 
					 | 
				
			||||||
$(rarpath)\dll.def
 | 
					 | 
				
			||||||
!else
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
!endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rar.obj :  $(rarpath)\rar.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rar.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\strlist.obj :  $(rarpath)\strlist.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\strlist.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\strfn.obj :  $(rarpath)\strfn.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\strfn.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\pathfn.obj :  $(rarpath)\pathfn.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\pathfn.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\savepos.obj :  $(rarpath)\savepos.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\savepos.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\smallfn.obj :  $(rarpath)\smallfn.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\smallfn.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\global.obj :  $(rarpath)\global.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -H- -o$@ $(rarpath)\global.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\file.obj :  $(rarpath)\file.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\file.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\filefn.obj :  $(rarpath)\filefn.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\filefn.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\filestr.obj :  $(rarpath)\filestr.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\filestr.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\filcreat.obj :  $(rarpath)\filcreat.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\filcreat.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\sha1.obj :  $(rarpath)\sha1.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\sha1.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\ec.obj :  $(rarpath)\ec.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\ec.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\av.obj :  $(rarpath)\av.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\av.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\archive.obj :  $(rarpath)\archive.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\archive.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\arcread.obj :  $(rarpath)\arcread.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\arcread.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\unicode.obj :  $(rarpath)\unicode.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\unicode.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\system.obj :  $(rarpath)\system.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\system.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\isnt.obj :  $(rarpath)\isnt.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\isnt.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\crc.obj :  $(rarpath)\crc.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\crc.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\crypt.obj :  $(rarpath)\crypt.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\crypt.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rijndael.obj :  $(rarpath)\rijndael.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rijndael.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rawread.obj :  $(rarpath)\rawread.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rawread.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rawwrite.obj :  $(rarpath)\rawwrite.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rawwrite.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\encname.obj :  $(rarpath)\encname.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\encname.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\resource.obj :  $(rarpath)\resource.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\resource.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\match.obj :  $(rarpath)\match.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\match.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\find.obj :  $(rarpath)\find.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\find.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\scantree.obj :  $(rarpath)\scantree.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\scantree.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\timefn.obj :  $(rarpath)\timefn.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\timefn.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\getbits.obj :  $(rarpath)\getbits.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\getbits.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rarvm.obj :  $(rarpath)\rarvm.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rarvm.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\putbits.obj :  $(rarpath)\putbits.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\putbits.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\pack.obj :  $(rarpath)\pack.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\pack.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\packbord.obj :  $(rarpath)\packbord.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\packbord.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\packanlz.obj :  $(rarpath)\packanlz.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\packanlz.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\cblock.obj :  $(rarpath)\cblock.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\cblock.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\add.obj :  $(rarpath)\add.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\add.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\addlist.obj :  $(rarpath)\addlist.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\addlist.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\procarc.obj :  $(rarpath)\procarc.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\procarc.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\sfx.obj :  $(rarpath)\sfx.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\sfx.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\comment.obj :  $(rarpath)\comment.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\comment.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rs.obj :  $(rarpath)\rs.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rs.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\recvol.obj :  $(rarpath)\recvol.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\recvol.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\repair.obj :  $(rarpath)\repair.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\repair.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rdwrfn.obj :  $(rarpath)\rdwrfn.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rdwrfn.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\consio.obj :  $(rarpath)\consio.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\consio.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\cmddata.obj :  $(rarpath)\cmddata.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\cmddata.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\options.obj :  $(rarpath)\options.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\options.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\ulinks.obj :  $(rarpath)\ulinks.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\ulinks.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\errhnd.obj :  $(rarpath)\errhnd.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\errhnd.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\volume.obj :  $(rarpath)\volume.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\volume.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\extinfo.obj :  $(rarpath)\extinfo.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\extinfo.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\extract.obj :  $(rarpath)\extract.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\extract.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\list.obj :  $(rarpath)\list.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\list.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\rtl.obj :  $(rarpath)\rtl.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\rtl.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\unpack.obj :  $(rarpath)\unpack.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\unpack.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(objpath)\dll.obj :  $(rarpath)\dll.cpp
 | 
					 | 
				
			||||||
  $(cc) -q @&&|
 | 
					 | 
				
			||||||
 $(compopt) -o$@ $(rarpath)\dll.cpp
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,54 +0,0 @@
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Makefile for cygmin/mingw - unrar
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Note: you have to 'make clean' before you can build
 | 
					 | 
				
			||||||
#	the sfx module
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# POSIX using Cygmin GCC 3.3.1
 | 
					 | 
				
			||||||
#CXX = g++
 | 
					 | 
				
			||||||
#CXXFLAGS = -O2 -Wno-deprecated 
 | 
					 | 
				
			||||||
#DEFINES = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DLITTLE_ENDIAN
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Win32 using Cygmin GCC 3.3.1
 | 
					 | 
				
			||||||
CXX = g++ -mno-cygwin
 | 
					 | 
				
			||||||
CXXFLAGS = -O2 -Wno-deprecated 
 | 
					 | 
				
			||||||
DEFINES = -D_MSC_VER -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Win32 using Mingw32 GCC 3.3.2
 | 
					 | 
				
			||||||
#CXX = g++
 | 
					 | 
				
			||||||
#CXXFLAGS = -O2 -Wno-deprecated 
 | 
					 | 
				
			||||||
#DEFINES = -D_MSC_VER -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##########################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
COMPILE=$(CXX) $(CXXFLAGS) $(DEFINES)
 | 
					 | 
				
			||||||
LINK=$(CXX)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UNRAR_OBJ=filestr.o recvol.o rs.o scantree.o
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
OBJECTS=rar.o strlist.o strfn.o pathfn.o savepos.o smallfn.o global.o \
 | 
					 | 
				
			||||||
       	file.o filefn.o filcreat.o archive.o arcread.o unicode.o \
 | 
					 | 
				
			||||||
	system.o isnt.o crypt.o crc.o rawread.o encname.o \
 | 
					 | 
				
			||||||
	resource.o match.o timefn.o rdwrfn.o consio.o options.o \
 | 
					 | 
				
			||||||
	ulinks.o errhnd.o rarvm.o rijndael.o getbits.o sha1.o \
 | 
					 | 
				
			||||||
	extinfo.o extract.o volume.o list.o find.o unpack.o cmddata.o
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.cpp.o:
 | 
					 | 
				
			||||||
	$(COMPILE) -D$(WHAT) -c $<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
all:	unrar
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean:
 | 
					 | 
				
			||||||
	@rm -f *.o *.bak *~
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
unrar:	WHAT=UNRAR
 | 
					 | 
				
			||||||
unrar:	$(OBJECTS) $(UNRAR_OBJ)
 | 
					 | 
				
			||||||
	@rm -f makeunrar
 | 
					 | 
				
			||||||
	$(LINK) -Wl,-s -o unrar $(LDFLAGS) $(OBJECTS) $(UNRAR_OBJ) $(LIBS)	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sfx:	WHAT=SFX_MODULE
 | 
					 | 
				
			||||||
sfx:	$(OBJECTS)
 | 
					 | 
				
			||||||
	@rm -f default.sfx
 | 
					 | 
				
			||||||
	$(LINK) -Wl,-s -o default.sfx $(LDFLAGS) $(OBJECTS) -DSFX_MODULE 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,50 +0,0 @@
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Makefile for DJGPP - unrar
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Note: you have to 'make clean' before you can build
 | 
					 | 
				
			||||||
#	the sfx module
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# DOS32 using DJGPP 2.03 Patchlevel 2 and GCC 2.95.3
 | 
					 | 
				
			||||||
CXX = gpp
 | 
					 | 
				
			||||||
CXXFLAGS = -O2 -Wno-deprecated
 | 
					 | 
				
			||||||
#DEFINES = -D_MSC_VER -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##########################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: all clean veryclean
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
COMPILE=$(CXX) $(CXXFLAGS) $(DEFINES)
 | 
					 | 
				
			||||||
LINK=$(CXX)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UNRAR_OBJ=filestr.o recvol.o rs.o scantree.o
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
OBJECTS=rar.o strlist.o strfn.o pathfn.o savepos.o smallfn.o global.o \
 | 
					 | 
				
			||||||
	file.o filefn.o filcreat.o archive.o arcread.o unicode.o \
 | 
					 | 
				
			||||||
	system.o isnt.o crypt.o crc.o rawread.o encname.o \
 | 
					 | 
				
			||||||
	resource.o match.o timefn.o rdwrfn.o consio.o options.o \
 | 
					 | 
				
			||||||
	ulinks.o errhnd.o rarvm.o rijndael.o getbits.o sha1.o \
 | 
					 | 
				
			||||||
	extinfo.o extract.o volume.o list.o find.o unpack.o cmddata.o
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.cpp.o:
 | 
					 | 
				
			||||||
	$(COMPILE) -D$(WHAT) -c $<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
all:	unrar
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
unrar:	WHAT=UNRAR
 | 
					 | 
				
			||||||
unrar:	$(OBJECTS) $(UNRAR_OBJ)
 | 
					 | 
				
			||||||
	$(LINK) -Wl,-s -o unrar.exe $(LDFLAGS) $(OBJECTS) $(UNRAR_OBJ) $(LIBS)
 | 
					 | 
				
			||||||
	exe2coff unrar.exe
 | 
					 | 
				
			||||||
	cp -u $(DJDIR)/bin/cwsdstub.exe .
 | 
					 | 
				
			||||||
	copy /b cwsdstub.exe+unrar unrar.exe
 | 
					 | 
				
			||||||
	-upx --ultra-brute unrar.exe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sfx:	WHAT=SFX_MODULE
 | 
					 | 
				
			||||||
sfx:	$(OBJECTS)
 | 
					 | 
				
			||||||
	$(LINK) -Wl,-s -o default.sfx $(LDFLAGS) $(OBJECTS) -DSFX_MODULE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean:
 | 
					 | 
				
			||||||
	$(RM) $(OBJECTS) $(UNRAR_OBJ)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
veryclean: clean
 | 
					 | 
				
			||||||
	$(RM) unrar.exe default.sfx cwsdstub.exe unrar
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,54 +0,0 @@
 | 
				
			||||||
# Makefile for Digital Mars C++ Compiler
 | 
					 | 
				
			||||||
# http://www.rarlab.com
 | 
					 | 
				
			||||||
# http://www.digitalmars.com
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DEFINES: UNRAR RARDLL GUI SFX_MODULE SILENT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NAME = unrar
 | 
					 | 
				
			||||||
EXT = exe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CPP = dmc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LINK = link
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# --------------
 | 
					 | 
				
			||||||
# Release Build
 | 
					 | 
				
			||||||
# --------------
 | 
					 | 
				
			||||||
DEFINES = -DNDEBUG -D_MSC_VER -DUNRAR
 | 
					 | 
				
			||||||
CPPFLAGS = -o+all -ff -Nc -g- -Ae
 | 
					 | 
				
			||||||
LNKFLAGS = /EXETYPE:NT /MACHINE:i386 /SUBSYSTEM:CONSOLE /NOLOGO /NODEBUG /NOCODEVIEW /PACKFUNCTIONS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# --------------
 | 
					 | 
				
			||||||
# Debug Build
 | 
					 | 
				
			||||||
# --------------
 | 
					 | 
				
			||||||
#DEFINES = -D_DEBUG -D_MSC_VER -DUNRAR
 | 
					 | 
				
			||||||
#CPPFLAGS = -o+none -Nc -S -gf -Ae
 | 
					 | 
				
			||||||
#LNKFLAGS = /EXETYPE:NT /MACHINE:i386 /SUBSYSTEM:CONSOLE /NOLOGO /DEBUG
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
OBJ = rar.obj strlist.obj strfn.obj pathfn.obj savepos.obj smallfn.o global.obj \
 | 
					 | 
				
			||||||
       	file.obj filefn.obj filcreat.obj archive.obj arcread.obj unicode.obj \
 | 
					 | 
				
			||||||
	system.obj isnt.obj crypt.obj crc.obj rawread.obj encname.obj \
 | 
					 | 
				
			||||||
	resource.obj match.obj timefn.obj rdwrfn.obj consio.obj options.obj \
 | 
					 | 
				
			||||||
	ulinks.obj errhnd.obj rarvm.obj rijndael.obj getbits.obj sha1.obj \
 | 
					 | 
				
			||||||
	extinfo.obj extract.obj volume.obj find.obj unpack.obj cmddata.obj \
 | 
					 | 
				
			||||||
	filestr.obj recvol.obj rs.obj scantree.obj \
 | 
					 | 
				
			||||||
	list.obj \
 | 
					 | 
				
			||||||
#	dll.obj \
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LIB = kernel32.lib+user32.lib+advapi32.lib
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#DEF = dll.def
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
link: $(OBJ)
 | 
					 | 
				
			||||||
	$(LINK) $(LNKFLAGS) $(OBJ), $(NAME).$(EXT), $(NAME).map, $(LIB), $(DEF)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.c.obj:
 | 
					 | 
				
			||||||
	$(CPP) $(CPPFLAGS) $(DEFINES) -c $< -o $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.cpp.obj:
 | 
					 | 
				
			||||||
	$(CPP) $(CPPFLAGS) $(DEFINES) -c $< -o $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean:
 | 
					 | 
				
			||||||
	del $(OBJ)
 | 
					 | 
				
			||||||
	del $(NAME).$(EXT)
 | 
					 | 
				
			||||||
	del $(NAME).map
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,564 +0,0 @@
 | 
				
			||||||
# Microsoft Developer Studio Generated NMAKE File, Based on unrar.dsp
 | 
					 | 
				
			||||||
!IF "$(CFG)" == ""
 | 
					 | 
				
			||||||
CFG=unrar - Win32 Release
 | 
					 | 
				
			||||||
!MESSAGE No configuration specified. Defaulting to unrar - Win32 Release.
 | 
					 | 
				
			||||||
!ENDIF 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!IF "$(CFG)" != "unrar - Win32 Release" && "$(CFG)" != "unrar - Win32 Debug"
 | 
					 | 
				
			||||||
!MESSAGE Invalid configuration "$(CFG)" specified.
 | 
					 | 
				
			||||||
!MESSAGE You can specify a configuration when running NMAKE
 | 
					 | 
				
			||||||
!MESSAGE by defining the macro CFG on the command line. For example:
 | 
					 | 
				
			||||||
!MESSAGE 
 | 
					 | 
				
			||||||
!MESSAGE NMAKE /f "unrar.mak" CFG="unrar - Win32 Debug"
 | 
					 | 
				
			||||||
!MESSAGE 
 | 
					 | 
				
			||||||
!MESSAGE Possible choices for configuration are:
 | 
					 | 
				
			||||||
!MESSAGE 
 | 
					 | 
				
			||||||
!MESSAGE "unrar - Win32 Release" (based on "Win32 (x86) Console Application")
 | 
					 | 
				
			||||||
!MESSAGE "unrar - Win32 Debug" (based on "Win32 (x86) Console Application")
 | 
					 | 
				
			||||||
!MESSAGE 
 | 
					 | 
				
			||||||
!ERROR An invalid configuration is specified.
 | 
					 | 
				
			||||||
!ENDIF 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!IF "$(OS)" == "Windows_NT"
 | 
					 | 
				
			||||||
NULL=
 | 
					 | 
				
			||||||
!ELSE 
 | 
					 | 
				
			||||||
NULL=nul
 | 
					 | 
				
			||||||
!ENDIF 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CPP=cl.exe
 | 
					 | 
				
			||||||
RSC=rc.exe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!IF  "$(CFG)" == "unrar - Win32 Release"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
OUTDIR=.\Release
 | 
					 | 
				
			||||||
INTDIR=.\Release
 | 
					 | 
				
			||||||
# Begin Custom Macros
 | 
					 | 
				
			||||||
OutDir=.\Release
 | 
					 | 
				
			||||||
# End Custom Macros
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ALL : "$(OUTDIR)\unrar.exe"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEAN :
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\archive.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\arcread.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\cmddata.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\consio.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\crc.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\crypt.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\encname.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\errhnd.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\extinfo.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\extract.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\filcreat.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\file.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\filefn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\filestr.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\find.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\getbits.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\global.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\isnt.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\list.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\match.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\options.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\pathfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rar.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rarvm.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rawread.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rdwrfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\recvol.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\resource.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rijndael.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rs.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\savepos.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\smallfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\scantree.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\sha1.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\strfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\strlist.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\system.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\timefn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\ulinks.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\unicode.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\unpack.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\vc60.idb"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\volume.obj"
 | 
					 | 
				
			||||||
	-@erase "$(OUTDIR)\unrar.exe"
 | 
					 | 
				
			||||||
	-@erase "$(OUTDIR)\unrar.map"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(OUTDIR)" :
 | 
					 | 
				
			||||||
    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CPP_PROJ=/nologo /W3 /EHsc /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "UNRAR" /D _CRT_SECURE_NO_WARNINGS /Fp"$(INTDIR)\unrar.pch" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
 | 
					 | 
				
			||||||
BSC32=bscmake.exe
 | 
					 | 
				
			||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\unrar.bsc" 
 | 
					 | 
				
			||||||
BSC32_SBRS= \
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
LINK32=link.exe
 | 
					 | 
				
			||||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\unrar.pdb" /map:"$(INTDIR)\unrar.map" /machine:I386 /out:"$(OUTDIR)\unrar.exe" 
 | 
					 | 
				
			||||||
LINK32_OBJS= \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rar.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\strlist.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\strfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\pathfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\savepos.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\smallfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\global.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\file.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\filefn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\filcreat.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\archive.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\arcread.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\unicode.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\system.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\isnt.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\crypt.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\crc.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rawread.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\encname.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\resource.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\match.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\timefn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rdwrfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\consio.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\options.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\ulinks.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\errhnd.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rarvm.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rijndael.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\getbits.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\sha1.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\extinfo.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\extract.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\volume.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\list.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\find.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\unpack.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\cmddata.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\filestr.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\recvol.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rs.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\scantree.obj"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(OUTDIR)\unrar.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
 | 
					 | 
				
			||||||
    $(LINK32) @<<
 | 
					 | 
				
			||||||
  $(LINK32_FLAGS) $(LINK32_OBJS)
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ELSEIF  "$(CFG)" == "unrar - Win32 Debug"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
OUTDIR=.\Debug
 | 
					 | 
				
			||||||
INTDIR=.\Debug
 | 
					 | 
				
			||||||
# Begin Custom Macros
 | 
					 | 
				
			||||||
OutDir=.\Debug
 | 
					 | 
				
			||||||
# End Custom Macros
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ALL : "$(OUTDIR)\unrar.exe"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEAN :
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\archive.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\arcread.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\cmddata.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\consio.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\crc.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\crypt.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\encname.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\errhnd.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\extinfo.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\extract.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\filcreat.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\file.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\filefn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\filestr.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\find.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\getbits.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\global.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\isnt.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\list.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\match.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\options.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\pathfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rar.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rarvm.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rawread.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rdwrfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\recvol.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\resource.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rijndael.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\rs.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\savepos.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\smallfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\scantree.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\sha1.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\strfn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\strlist.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\system.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\timefn.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\ulinks.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\unicode.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\unpack.obj"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\vc60.idb"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\vc60.pdb"
 | 
					 | 
				
			||||||
	-@erase "$(INTDIR)\volume.obj"
 | 
					 | 
				
			||||||
	-@erase "$(OUTDIR)\unrar.exe"
 | 
					 | 
				
			||||||
	-@erase "$(OUTDIR)\unrar.ilk"
 | 
					 | 
				
			||||||
	-@erase "$(OUTDIR)\unrar.pdb"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(OUTDIR)" :
 | 
					 | 
				
			||||||
    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CPP_PROJ=/nologo /W3 /Gm /EHsc /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "UNRAR" /D _CRT_SECURE_NO_WARNINGS /Fp"$(INTDIR)\unrar.pch" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c 
 | 
					 | 
				
			||||||
BSC32=bscmake.exe
 | 
					 | 
				
			||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\unrar.bsc" 
 | 
					 | 
				
			||||||
BSC32_SBRS= \
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
LINK32=link.exe
 | 
					 | 
				
			||||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\unrar.pdb" /debug /machine:I386 /out:"$(OUTDIR)\unrar.exe" /pdbtype:sept 
 | 
					 | 
				
			||||||
LINK32_OBJS= \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rar.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\strlist.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\strfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\pathfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\savepos.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\smallfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\global.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\file.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\filefn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\filcreat.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\archive.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\arcread.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\unicode.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\system.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\isnt.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\crypt.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\crc.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rawread.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\encname.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\resource.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\match.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\timefn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rdwrfn.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\consio.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\options.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\ulinks.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\errhnd.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rarvm.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rijndael.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\getbits.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\sha1.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\extinfo.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\extract.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\volume.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\list.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\find.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\unpack.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\cmddata.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\filestr.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\recvol.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\rs.obj" \
 | 
					 | 
				
			||||||
	"$(INTDIR)\scantree.obj"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(OUTDIR)\unrar.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
 | 
					 | 
				
			||||||
    $(LINK32) @<<
 | 
					 | 
				
			||||||
  $(LINK32_FLAGS) $(LINK32_OBJS)
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ENDIF 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.c{$(INTDIR)}.obj::
 | 
					 | 
				
			||||||
   $(CPP) @<<
 | 
					 | 
				
			||||||
   $(CPP_PROJ) $< 
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.cpp{$(INTDIR)}.obj::
 | 
					 | 
				
			||||||
   $(CPP) @<<
 | 
					 | 
				
			||||||
   $(CPP_PROJ) $< 
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.cxx{$(INTDIR)}.obj::
 | 
					 | 
				
			||||||
   $(CPP) @<<
 | 
					 | 
				
			||||||
   $(CPP_PROJ) $< 
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.c{$(INTDIR)}.sbr::
 | 
					 | 
				
			||||||
   $(CPP) @<<
 | 
					 | 
				
			||||||
   $(CPP_PROJ) $< 
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.cpp{$(INTDIR)}.sbr::
 | 
					 | 
				
			||||||
   $(CPP) @<<
 | 
					 | 
				
			||||||
   $(CPP_PROJ) $< 
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.cxx{$(INTDIR)}.sbr::
 | 
					 | 
				
			||||||
   $(CPP) @<<
 | 
					 | 
				
			||||||
   $(CPP_PROJ) $< 
 | 
					 | 
				
			||||||
<<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
 | 
					 | 
				
			||||||
!IF EXISTS("msc.dep")
 | 
					 | 
				
			||||||
!INCLUDE "msc.dep"
 | 
					 | 
				
			||||||
!ELSE 
 | 
					 | 
				
			||||||
!MESSAGE Warning: cannot find "msc.dep"
 | 
					 | 
				
			||||||
!ENDIF 
 | 
					 | 
				
			||||||
!ENDIF 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!IF "$(CFG)" == "unrar - Win32 Release" || "$(CFG)" == "unrar - Win32 Debug"
 | 
					 | 
				
			||||||
SOURCE=.\archive.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\archive.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\arcread.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\arcread.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\cmddata.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\cmddata.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\consio.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\consio.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\crc.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\crc.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\crypt.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\crypt.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\encname.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\encname.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\errhnd.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\errhnd.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\extinfo.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\extinfo.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\extract.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\extract.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\filcreat.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\filcreat.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\file.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\file.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\filefn.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\filefn.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\filestr.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\filestr.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\find.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\find.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\getbits.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\getbits.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\global.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\global.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\isnt.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\isnt.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\list.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\list.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\match.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\match.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\options.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\options.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\pathfn.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\pathfn.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\rar.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\rar.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\rarvm.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\rarvm.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\rawread.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\rawread.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\rdwrfn.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\rdwrfn.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\recvol.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\recvol.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\resource.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\resource.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\rijndael.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\rijndael.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\rs.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\rs.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\savepos.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\savepos.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\smallfn.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\smallfn.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\scantree.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\scantree.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\sha1.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\sha1.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\strfn.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\strfn.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\strlist.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\strlist.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\system.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\system.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\timefn.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\timefn.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\ulinks.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\ulinks.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\unicode.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\unicode.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\unpack.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\unpack.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\volume.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"$(INTDIR)\volume.obj" : $(SOURCE) "$(INTDIR)"
 | 
					 | 
				
			||||||
	$(CPP) $(CPP_PROJ) $(SOURCE)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!ENDIF 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,183 +1,82 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool match(char *pattern,char *string,bool ForceCase);
 | 
					static bool match(const wchar *pattern,const wchar *string,bool ForceCase);
 | 
				
			||||||
static bool match(wchar *pattern,wchar *string,bool ForceCase);
 | 
					static int mwcsicompc(const wchar *Str1,const wchar *Str2,bool ForceCase);
 | 
				
			||||||
 | 
					static int mwcsnicompc(const wchar *Str1,const wchar *Str2,size_t N,bool ForceCase);
 | 
				
			||||||
static int mstricompc(const char *Str1,const char *Str2,bool ForceCase);
 | 
					 | 
				
			||||||
static int mstricompcw(const wchar *Str1,const wchar *Str2,bool ForceCase);
 | 
					 | 
				
			||||||
static int mstrnicompc(const char *Str1,const char *Str2,size_t N,bool ForceCase);
 | 
					 | 
				
			||||||
static int mstrnicompcw(const wchar *Str1,const wchar *Str2,size_t N,bool ForceCase);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint toupperc(byte ch,bool ForceCase)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (ForceCase)
 | 
					 | 
				
			||||||
    return(ch);
 | 
					 | 
				
			||||||
#ifdef _WIN_32
 | 
					 | 
				
			||||||
  return((uint)(LPARAM)CharUpper((LPTSTR)(ch)));
 | 
					 | 
				
			||||||
#elif defined(_UNIX)
 | 
					 | 
				
			||||||
  return(ch);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  return(toupper(ch));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline uint touppercw(uint ch,bool ForceCase)
 | 
					inline uint touppercw(uint ch,bool ForceCase)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (ForceCase)
 | 
					  if (ForceCase)
 | 
				
			||||||
    return(ch);
 | 
					    return ch;
 | 
				
			||||||
#if defined(_UNIX)
 | 
					#if defined(_UNIX)
 | 
				
			||||||
  return(ch);
 | 
					  return ch;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return(toupperw(ch));
 | 
					  return toupperw(ch);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool CmpName(char *Wildcard,char *Name,int CmpPath)
 | 
					bool CmpName(const wchar *Wildcard,const wchar *Name,int CmpMode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  bool ForceCase=(CmpPath&MATCH_FORCECASESENSITIVE)!=0;
 | 
					  bool ForceCase=(CmpMode&MATCH_FORCECASESENSITIVE)!=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CmpPath&=MATCH_MODEMASK;
 | 
					  CmpMode&=MATCH_MODEMASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (CmpPath!=MATCH_NAMES)
 | 
					  if (CmpMode!=MATCH_NAMES)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    size_t WildLength=strlen(Wildcard);
 | 
					    size_t WildLength=wcslen(Wildcard);
 | 
				
			||||||
    if (CmpPath!=MATCH_EXACTPATH && mstrnicompc(Wildcard,Name,WildLength,ForceCase)==0)
 | 
					    if (CmpMode!=MATCH_EXACT && CmpMode!=MATCH_EXACTPATH && CmpMode!=MATCH_ALLWILD &&
 | 
				
			||||||
    {
 | 
					        mwcsnicompc(Wildcard,Name,WildLength,ForceCase)==0)
 | 
				
			||||||
      char NextCh=Name[WildLength];
 | 
					 | 
				
			||||||
      if (NextCh=='\\' || NextCh=='/' || NextCh==0)
 | 
					 | 
				
			||||||
        return(true);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    char Path1[NM],Path2[NM];
 | 
					 | 
				
			||||||
    GetFilePath(Wildcard,Path1,ASIZE(Path1));
 | 
					 | 
				
			||||||
    GetFilePath(Name,Path2,ASIZE(Path1));
 | 
					 | 
				
			||||||
    if (mstricompc(Wildcard,Path2,ForceCase)==0)
 | 
					 | 
				
			||||||
      return(true);
 | 
					 | 
				
			||||||
    if ((CmpPath==MATCH_PATH || CmpPath==MATCH_EXACTPATH) && mstricompc(Path1,Path2,ForceCase)!=0)
 | 
					 | 
				
			||||||
      return(false);
 | 
					 | 
				
			||||||
    if (CmpPath==MATCH_SUBPATH || CmpPath==MATCH_WILDSUBPATH)
 | 
					 | 
				
			||||||
      if (IsWildcard(Path1))
 | 
					 | 
				
			||||||
        return(match(Wildcard,Name,ForceCase));
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        if (CmpPath==MATCH_SUBPATH || IsWildcard(Wildcard))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          if (*Path1 && mstrnicompc(Path1,Path2,strlen(Path1),ForceCase)!=0)
 | 
					 | 
				
			||||||
            return(false);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          if (mstricompc(Path1,Path2,ForceCase)!=0)
 | 
					 | 
				
			||||||
            return(false);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  char *Name1=PointToName(Wildcard);
 | 
					 | 
				
			||||||
  char *Name2=PointToName(Name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // always return false for RAR temporary files to exclude them
 | 
					 | 
				
			||||||
  // from archiving operations
 | 
					 | 
				
			||||||
  if (mstrnicompc("__rar_",Name2,6,false)==0)
 | 
					 | 
				
			||||||
    return(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return(match(Name1,Name2,ForceCase));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
bool CmpName(wchar *Wildcard,wchar *Name,int CmpPath)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  bool ForceCase=(CmpPath&MATCH_FORCECASESENSITIVE)!=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CmpPath&=MATCH_MODEMASK;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (CmpPath!=MATCH_NAMES)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    size_t WildLength=strlenw(Wildcard);
 | 
					 | 
				
			||||||
    if (CmpPath!=MATCH_EXACTPATH && mstrnicompcw(Wildcard,Name,WildLength,ForceCase)==0)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					      // For all modes except MATCH_NAMES, MATCH_EXACT, MATCH_EXACTPATH, MATCH_ALLWILD,
 | 
				
			||||||
 | 
					      // "path1" mask must match "path1\path2\filename.ext" and "path1" names.
 | 
				
			||||||
      wchar NextCh=Name[WildLength];
 | 
					      wchar NextCh=Name[WildLength];
 | 
				
			||||||
      if (NextCh==L'\\' || NextCh==L'/' || NextCh==0)
 | 
					      if (NextCh==L'\\' || NextCh==L'/' || NextCh==0)
 | 
				
			||||||
        return(true);
 | 
					        return(true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Nothing more to compare for MATCH_SUBPATHONLY.
 | 
				
			||||||
 | 
					    if (CmpMode==MATCH_SUBPATHONLY)
 | 
				
			||||||
 | 
					      return(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wchar Path1[NM],Path2[NM];
 | 
					    wchar Path1[NM],Path2[NM];
 | 
				
			||||||
    GetFilePath(Wildcard,Path1,ASIZE(Path1));
 | 
					    GetFilePath(Wildcard,Path1,ASIZE(Path1));
 | 
				
			||||||
    GetFilePath(Name,Path2,ASIZE(Path2));
 | 
					    GetFilePath(Name,Path2,ASIZE(Path2));
 | 
				
			||||||
    if ((CmpPath==MATCH_PATH || CmpPath==MATCH_EXACTPATH) && mstricompcw(Path1,Path2,ForceCase)!=0)
 | 
					
 | 
				
			||||||
 | 
					    if ((CmpMode==MATCH_EXACT || CmpMode==MATCH_EXACTPATH) &&
 | 
				
			||||||
 | 
					        mwcsicompc(Path1,Path2,ForceCase)!=0)
 | 
				
			||||||
      return(false);
 | 
					      return(false);
 | 
				
			||||||
    if (CmpPath==MATCH_SUBPATH || CmpPath==MATCH_WILDSUBPATH)
 | 
					    if (CmpMode==MATCH_ALLWILD)
 | 
				
			||||||
      if (IsWildcard(NULL,Path1))
 | 
					      return match(Wildcard,Name,ForceCase);
 | 
				
			||||||
 | 
					    if (CmpMode==MATCH_SUBPATH || CmpMode==MATCH_WILDSUBPATH)
 | 
				
			||||||
 | 
					      if (IsWildcard(Path1))
 | 
				
			||||||
        return(match(Wildcard,Name,ForceCase));
 | 
					        return(match(Wildcard,Name,ForceCase));
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        if (CmpPath==MATCH_SUBPATH || IsWildcard(NULL,Wildcard))
 | 
					        if (CmpMode==MATCH_SUBPATH || IsWildcard(Wildcard))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          if (*Path1 && mstrnicompcw(Path1,Path2,strlenw(Path1),ForceCase)!=0)
 | 
					          if (*Path1 && mwcsnicompc(Path1,Path2,wcslen(Path1),ForceCase)!=0)
 | 
				
			||||||
            return(false);
 | 
					            return(false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
          if (mstricompcw(Path1,Path2,ForceCase)!=0)
 | 
					          if (mwcsicompc(Path1,Path2,ForceCase)!=0)
 | 
				
			||||||
            return(false);
 | 
					            return(false);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  wchar *Name1=PointToName(Wildcard);
 | 
					  wchar *Name1=PointToName(Wildcard);
 | 
				
			||||||
  wchar *Name2=PointToName(Name);
 | 
					  wchar *Name2=PointToName(Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // always return false for RAR temporary files to exclude them
 | 
					  // Always return false for RAR temporary files to exclude them
 | 
				
			||||||
  // from archiving operations
 | 
					  // from archiving operations.
 | 
				
			||||||
  if (mstrnicompcw(L"__rar_",Name2,6,false)==0)
 | 
					//  if (mwcsnicompc(L"__rar_",Name2,6,false)==0)
 | 
				
			||||||
    return(false);
 | 
					//    return(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (CmpMode==MATCH_EXACT)
 | 
				
			||||||
 | 
					    return(mwcsicompc(Name1,Name2,ForceCase)==0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return(match(Name1,Name2,ForceCase));
 | 
					  return(match(Name1,Name2,ForceCase));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool match(char *pattern,char *string,bool ForceCase)
 | 
					bool match(const wchar *pattern,const wchar *string,bool ForceCase)
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  for (;; ++string)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    char stringc=toupperc(*string,ForceCase);
 | 
					 | 
				
			||||||
    char patternc=toupperc(*pattern++,ForceCase);
 | 
					 | 
				
			||||||
    switch (patternc)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      case 0:
 | 
					 | 
				
			||||||
        return(stringc==0);
 | 
					 | 
				
			||||||
      case '?':
 | 
					 | 
				
			||||||
        if (stringc == 0)
 | 
					 | 
				
			||||||
          return(false);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      case '*':
 | 
					 | 
				
			||||||
        if (*pattern==0)
 | 
					 | 
				
			||||||
          return(true);
 | 
					 | 
				
			||||||
        if (*pattern=='.')
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          if (pattern[1]=='*' && pattern[2]==0)
 | 
					 | 
				
			||||||
            return(true);
 | 
					 | 
				
			||||||
          char *dot=strchr(string,'.');
 | 
					 | 
				
			||||||
          if (pattern[1]==0)
 | 
					 | 
				
			||||||
            return (dot==NULL || dot[1]==0);
 | 
					 | 
				
			||||||
          if (dot!=NULL)
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            string=dot;
 | 
					 | 
				
			||||||
            if (strpbrk(pattern,"*?")==NULL && strchr(string+1,'.')==NULL)
 | 
					 | 
				
			||||||
              return(mstricompc(pattern+1,string+1,ForceCase)==0);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while (*string)
 | 
					 | 
				
			||||||
          if (match(pattern,string++,ForceCase))
 | 
					 | 
				
			||||||
            return(true);
 | 
					 | 
				
			||||||
        return(false);
 | 
					 | 
				
			||||||
      default:
 | 
					 | 
				
			||||||
        if (patternc != stringc)
 | 
					 | 
				
			||||||
          if (patternc=='.' && stringc==0)
 | 
					 | 
				
			||||||
            return(match(pattern,string,ForceCase));
 | 
					 | 
				
			||||||
          else
 | 
					 | 
				
			||||||
            return(false);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
bool match(wchar *pattern,wchar *string,bool ForceCase)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  for (;; ++string)
 | 
					  for (;; ++string)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					@ -198,14 +97,14 @@ bool match(wchar *pattern,wchar *string,bool ForceCase)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          if (pattern[1]=='*' && pattern[2]==0)
 | 
					          if (pattern[1]=='*' && pattern[2]==0)
 | 
				
			||||||
            return(true);
 | 
					            return(true);
 | 
				
			||||||
          wchar *dot=strchrw(string,'.');
 | 
					          const wchar *dot=wcschr(string,'.');
 | 
				
			||||||
          if (pattern[1]==0)
 | 
					          if (pattern[1]==0)
 | 
				
			||||||
            return (dot==NULL || dot[1]==0);
 | 
					            return (dot==NULL || dot[1]==0);
 | 
				
			||||||
          if (dot!=NULL)
 | 
					          if (dot!=NULL)
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            string=dot;
 | 
					            string=dot;
 | 
				
			||||||
            if (strpbrkw(pattern,L"*?")==NULL && strchrw(string+1,'.')==NULL)
 | 
					            if (wcspbrk(pattern,L"*?")==NULL && wcschr(string+1,'.')==NULL)
 | 
				
			||||||
              return(mstricompcw(pattern+1,string+1,ForceCase)==0);
 | 
					              return(mwcsicompc(pattern+1,string+1,ForceCase)==0);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -215,56 +114,34 @@ bool match(wchar *pattern,wchar *string,bool ForceCase)
 | 
				
			||||||
        return(false);
 | 
					        return(false);
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
        if (patternc != stringc)
 | 
					        if (patternc != stringc)
 | 
				
			||||||
          if (patternc=='.' && stringc==0)
 | 
					        {
 | 
				
			||||||
 | 
					          // Allow "name." mask match "name" and "name.\" match "name\".
 | 
				
			||||||
 | 
					          if (patternc=='.' && (stringc==0 || stringc=='\\' || stringc=='.'))
 | 
				
			||||||
            return(match(pattern,string,ForceCase));
 | 
					            return(match(pattern,string,ForceCase));
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
            return(false);
 | 
					            return(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int mstricompc(const char *Str1,const char *Str2,bool ForceCase)
 | 
					int mwcsicompc(const wchar *Str1,const wchar *Str2,bool ForceCase)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (ForceCase)
 | 
					  if (ForceCase)
 | 
				
			||||||
    return(strcmp(Str1,Str2));
 | 
					    return wcscmp(Str1,Str2);
 | 
				
			||||||
  return(stricompc(Str1,Str2));
 | 
					  return wcsicompc(Str1,Str2);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					int mwcsnicompc(const wchar *Str1,const wchar *Str2,size_t N,bool ForceCase)
 | 
				
			||||||
int mstricompcw(const wchar *Str1,const wchar *Str2,bool ForceCase)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (ForceCase)
 | 
					  if (ForceCase)
 | 
				
			||||||
    return(strcmpw(Str1,Str2));
 | 
					    return wcsncmp(Str1,Str2,N);
 | 
				
			||||||
  return(stricompcw(Str1,Str2));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int mstrnicompc(const char *Str1,const char *Str2,size_t N,bool ForceCase)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (ForceCase)
 | 
					 | 
				
			||||||
    return(strncmp(Str1,Str2,N));
 | 
					 | 
				
			||||||
#if defined(_UNIX)
 | 
					#if defined(_UNIX)
 | 
				
			||||||
  return(strncmp(Str1,Str2,N));
 | 
					  return wcsncmp(Str1,Str2,N);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  return(strnicomp(Str1,Str2,N));
 | 
					  return wcsnicomp(Str1,Str2,N);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SFX_MODULE
 | 
					 | 
				
			||||||
int mstrnicompcw(const wchar *Str1,const wchar *Str2,size_t N,bool ForceCase)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (ForceCase)
 | 
					 | 
				
			||||||
    return(strncmpw(Str1,Str2,N));
 | 
					 | 
				
			||||||
#if defined(_UNIX)
 | 
					 | 
				
			||||||
  return(strncmpw(Str1,Str2,N));
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  return(strnicmpw(Str1,Str2,N));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,26 +2,37 @@
 | 
				
			||||||
#define _RAR_MATCH_
 | 
					#define _RAR_MATCH_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					enum {
 | 
				
			||||||
   MATCH_NAMES,        // Compare names only.
 | 
					   MATCH_NAMES,        // Paths are ignored.
 | 
				
			||||||
 | 
					                       // Compares names only using wildcards.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   MATCH_PATH,         // Compares names and paths. Both must match exactly.
 | 
					   MATCH_SUBPATHONLY,  // Paths must match either exactly or path in wildcard
 | 
				
			||||||
                       // Unlike MATCH_EXACTPATH, also matches names if
 | 
					                       // must be present in the beginning of file path.
 | 
				
			||||||
                       // mask contains path only and this path is a part
 | 
					                       // For example, "c:\path1\*" or "c:\path1" will match 
 | 
				
			||||||
                       // of name path.
 | 
					                       // "c:\path1\path2\file".
 | 
				
			||||||
 | 
					                       // Names are not compared.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   MATCH_EXACTPATH,    // Compares names and paths. Both must match exactly.
 | 
					   MATCH_EXACT,        // Paths must match exactly.
 | 
				
			||||||
 | 
					                       // Names must match exactly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   MATCH_ALLWILD,      // Paths and names are compared using wildcards.
 | 
				
			||||||
 | 
					                       // Unlike MATCH_SUBPATH, paths do not match subdirs
 | 
				
			||||||
 | 
					                       // unless a wildcard tells so.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   MATCH_EXACTPATH,    // Paths must match exactly.
 | 
				
			||||||
 | 
					                       // Names are compared using wildcards.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   MATCH_SUBPATH,      // Names must be the same, but path in mask is allowed
 | 
					   MATCH_SUBPATH,      // Names must be the same, but path in mask is allowed
 | 
				
			||||||
                       // to be only a part of name path.
 | 
					                       // to be only a part of name path. In other words,
 | 
				
			||||||
 | 
					                       // we match all files matching the file mask 
 | 
				
			||||||
 | 
					                       // in current folder and subfolders.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   MATCH_WILDSUBPATH   // Works as MATCH_SUBPATH if mask contains wildcards
 | 
					   MATCH_WILDSUBPATH   // Works as MATCH_SUBPATH if file mask contains
 | 
				
			||||||
                       // and as MATCH_PATH otherwise.
 | 
					                       // wildcards and as MATCH_EXACTPATH otherwise.
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MATCH_MODEMASK           0x0000ffff
 | 
					#define MATCH_MODEMASK           0x0000ffff
 | 
				
			||||||
#define MATCH_FORCECASESENSITIVE 0x80000000
 | 
					#define MATCH_FORCECASESENSITIVE 0x80000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool CmpName(char *Wildcard,char *Name,int CmpPath);
 | 
					bool CmpName(const wchar *Wildcard,const wchar *Name,int CmpMode);
 | 
				
			||||||
bool CmpName(wchar *Wildcard,wchar *Name,int CmpPath);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,10 +5,17 @@
 | 
				
			||||||
 *  Contents: model description and encoding/decoding routines              *
 | 
					 *  Contents: model description and encoding/decoding routines              *
 | 
				
			||||||
 ****************************************************************************/
 | 
					 ****************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline PPM_CONTEXT* PPM_CONTEXT::createChild(ModelPPM *Model,STATE* pStats,
 | 
					static const int MAX_O=64; /* maximum allowed model order */
 | 
				
			||||||
                                             STATE& FirstState)
 | 
					const uint TOP=1 << 24, BOT=1 << 15;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class T>
 | 
				
			||||||
 | 
					inline void _PPMD_SWAP(T& t1,T& t2) { T tmp=t1; t1=t2; t2=tmp; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline RARPPM_CONTEXT* RARPPM_CONTEXT::createChild(ModelPPM *Model,RARPPM_STATE* pStats,
 | 
				
			||||||
 | 
					                                             RARPPM_STATE& FirstState)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  PPM_CONTEXT* pc = (PPM_CONTEXT*) Model->SubAlloc.AllocContext();
 | 
					  RARPPM_CONTEXT* pc = (RARPPM_CONTEXT*) Model->SubAlloc.AllocContext();
 | 
				
			||||||
  if ( pc ) 
 | 
					  if ( pc ) 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    pc->NumStats=1;                     
 | 
					    pc->NumStats=1;                     
 | 
				
			||||||
| 
						 | 
					@ -34,11 +41,15 @@ void ModelPPM::RestartModelRare()
 | 
				
			||||||
  memset(CharMask,0,sizeof(CharMask));
 | 
					  memset(CharMask,0,sizeof(CharMask));
 | 
				
			||||||
  SubAlloc.InitSubAllocator();
 | 
					  SubAlloc.InitSubAllocator();
 | 
				
			||||||
  InitRL=-(MaxOrder < 12 ? MaxOrder:12)-1;
 | 
					  InitRL=-(MaxOrder < 12 ? MaxOrder:12)-1;
 | 
				
			||||||
  MinContext = MaxContext = (PPM_CONTEXT*) SubAlloc.AllocContext();
 | 
					  MinContext = MaxContext = (RARPPM_CONTEXT*) SubAlloc.AllocContext();
 | 
				
			||||||
 | 
					  if (MinContext == NULL)
 | 
				
			||||||
 | 
					    throw std::bad_alloc();
 | 
				
			||||||
  MinContext->Suffix=NULL;
 | 
					  MinContext->Suffix=NULL;
 | 
				
			||||||
  OrderFall=MaxOrder;
 | 
					  OrderFall=MaxOrder;
 | 
				
			||||||
  MinContext->U.SummFreq=(MinContext->NumStats=256)+1;
 | 
					  MinContext->U.SummFreq=(MinContext->NumStats=256)+1;
 | 
				
			||||||
  FoundState=MinContext->U.Stats=(STATE*)SubAlloc.AllocUnits(256/2);
 | 
					  FoundState=MinContext->U.Stats=(RARPPM_STATE*)SubAlloc.AllocUnits(256/2);
 | 
				
			||||||
 | 
					  if (FoundState == NULL)
 | 
				
			||||||
 | 
					    throw std::bad_alloc();
 | 
				
			||||||
  for (RunLength=InitRL, PrevSuccess=i=0;i < 256;i++) 
 | 
					  for (RunLength=InitRL, PrevSuccess=i=0;i < 256;i++) 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    MinContext->U.Stats[i].Symbol=i;      
 | 
					    MinContext->U.Stats[i].Symbol=i;      
 | 
				
			||||||
| 
						 | 
					@ -105,10 +116,10 @@ void ModelPPM::StartModelRare(int MaxOrder)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void PPM_CONTEXT::rescale(ModelPPM *Model)
 | 
					void RARPPM_CONTEXT::rescale(ModelPPM *Model)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int OldNS=NumStats, i=NumStats-1, Adder, EscFreq;
 | 
					  int OldNS=NumStats, i=NumStats-1, Adder, EscFreq;
 | 
				
			||||||
  STATE* p1, * p;
 | 
					  RARPPM_STATE* p1, * p;
 | 
				
			||||||
  for (p=Model->FoundState;p != U.Stats;p--)
 | 
					  for (p=Model->FoundState;p != U.Stats;p--)
 | 
				
			||||||
    _PPMD_SWAP(p[0],p[-1]);
 | 
					    _PPMD_SWAP(p[0],p[-1]);
 | 
				
			||||||
  U.Stats->Freq += 4;
 | 
					  U.Stats->Freq += 4;
 | 
				
			||||||
| 
						 | 
					@ -122,7 +133,7 @@ void PPM_CONTEXT::rescale(ModelPPM *Model)
 | 
				
			||||||
    U.SummFreq += (p->Freq=(p->Freq+Adder) >> 1);
 | 
					    U.SummFreq += (p->Freq=(p->Freq+Adder) >> 1);
 | 
				
			||||||
    if (p[0].Freq > p[-1].Freq) 
 | 
					    if (p[0].Freq > p[-1].Freq) 
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      STATE tmp=*(p1=p);
 | 
					      RARPPM_STATE tmp=*(p1=p);
 | 
				
			||||||
      do 
 | 
					      do 
 | 
				
			||||||
      { 
 | 
					      { 
 | 
				
			||||||
        p1[0]=p1[-1]; 
 | 
					        p1[0]=p1[-1]; 
 | 
				
			||||||
| 
						 | 
					@ -139,7 +150,7 @@ void PPM_CONTEXT::rescale(ModelPPM *Model)
 | 
				
			||||||
    EscFreq += i;
 | 
					    EscFreq += i;
 | 
				
			||||||
    if ((NumStats -= i) == 1) 
 | 
					    if ((NumStats -= i) == 1) 
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      STATE tmp=*U.Stats;
 | 
					      RARPPM_STATE tmp=*U.Stats;
 | 
				
			||||||
      do 
 | 
					      do 
 | 
				
			||||||
      { 
 | 
					      { 
 | 
				
			||||||
        tmp.Freq-=(tmp.Freq >> 1); 
 | 
					        tmp.Freq-=(tmp.Freq >> 1); 
 | 
				
			||||||
| 
						 | 
					@ -152,19 +163,16 @@ void PPM_CONTEXT::rescale(ModelPPM *Model)
 | 
				
			||||||
  U.SummFreq += (EscFreq -= (EscFreq >> 1));
 | 
					  U.SummFreq += (EscFreq -= (EscFreq >> 1));
 | 
				
			||||||
  int n0=(OldNS+1) >> 1, n1=(NumStats+1) >> 1;
 | 
					  int n0=(OldNS+1) >> 1, n1=(NumStats+1) >> 1;
 | 
				
			||||||
  if (n0 != n1)
 | 
					  if (n0 != n1)
 | 
				
			||||||
    U.Stats = (STATE*) Model->SubAlloc.ShrinkUnits(U.Stats,n0,n1);
 | 
					    U.Stats = (RARPPM_STATE*) Model->SubAlloc.ShrinkUnits(U.Stats,n0,n1);
 | 
				
			||||||
  Model->FoundState=U.Stats;
 | 
					  Model->FoundState=U.Stats;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline PPM_CONTEXT* ModelPPM::CreateSuccessors(bool Skip,STATE* p1)
 | 
					inline RARPPM_CONTEXT* ModelPPM::CreateSuccessors(bool Skip,RARPPM_STATE* p1)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef __ICL
 | 
					  RARPPM_STATE UpState;
 | 
				
			||||||
  static
 | 
					  RARPPM_CONTEXT* pc=MinContext, * UpBranch=FoundState->Successor;
 | 
				
			||||||
#endif
 | 
					  RARPPM_STATE * p, * ps[MAX_O], ** pps=ps;
 | 
				
			||||||
  STATE UpState;
 | 
					 | 
				
			||||||
  PPM_CONTEXT* pc=MinContext, * UpBranch=FoundState->Successor;
 | 
					 | 
				
			||||||
  STATE * p, * ps[MAX_O], ** pps=ps;
 | 
					 | 
				
			||||||
  if ( !Skip ) 
 | 
					  if ( !Skip ) 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    *pps++ = FoundState;
 | 
					    *pps++ = FoundState;
 | 
				
			||||||
| 
						 | 
					@ -195,14 +203,21 @@ LOOP_ENTRY:
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      pc=p->Successor;
 | 
					      pc=p->Successor;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    // We ensure that PPM order input parameter does not exceed MAX_O (64),
 | 
				
			||||||
 | 
					    // so we do not really need this check and added it for extra safety.
 | 
				
			||||||
 | 
					    // See CVE-2017-17969 for details.
 | 
				
			||||||
 | 
					    if (pps>=ps+ASIZE(ps))
 | 
				
			||||||
 | 
					      return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *pps++ = p;
 | 
					    *pps++ = p;
 | 
				
			||||||
  } while ( pc->Suffix );
 | 
					  } while ( pc->Suffix );
 | 
				
			||||||
NO_LOOP:
 | 
					NO_LOOP:
 | 
				
			||||||
  if (pps == ps)
 | 
					  if (pps == ps)
 | 
				
			||||||
    return pc;
 | 
					    return pc;
 | 
				
			||||||
  UpState.Symbol=*(byte*) UpBranch;
 | 
					  UpState.Symbol=*(byte*) UpBranch;
 | 
				
			||||||
  UpState.Successor=(PPM_CONTEXT*) (((byte*) UpBranch)+1);
 | 
					  UpState.Successor=(RARPPM_CONTEXT*) (((byte*) UpBranch)+1);
 | 
				
			||||||
  if (pc->NumStats != 1) 
 | 
					  if (pc->NumStats != 1) 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if ((byte*) pc <= SubAlloc.pText)
 | 
					    if ((byte*) pc <= SubAlloc.pText)
 | 
				
			||||||
| 
						 | 
					@ -230,8 +245,8 @@ NO_LOOP:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void ModelPPM::UpdateModel()
 | 
					inline void ModelPPM::UpdateModel()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  STATE fs = *FoundState, *p = NULL;
 | 
					  RARPPM_STATE fs = *FoundState, *p = NULL;
 | 
				
			||||||
  PPM_CONTEXT *pc, *Successor;
 | 
					  RARPPM_CONTEXT *pc, *Successor;
 | 
				
			||||||
  uint ns1, ns, cf, sf, s0;
 | 
					  uint ns1, ns, cf, sf, s0;
 | 
				
			||||||
  if (fs.Freq < MAX_FREQ/4 && (pc=MinContext->Suffix) != NULL) 
 | 
					  if (fs.Freq < MAX_FREQ/4 && (pc=MinContext->Suffix) != NULL) 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					@ -269,7 +284,7 @@ inline void ModelPPM::UpdateModel()
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  *SubAlloc.pText++ = fs.Symbol;                   
 | 
					  *SubAlloc.pText++ = fs.Symbol;                   
 | 
				
			||||||
  Successor = (PPM_CONTEXT*) SubAlloc.pText;
 | 
					  Successor = (RARPPM_CONTEXT*) SubAlloc.pText;
 | 
				
			||||||
  if (SubAlloc.pText >= SubAlloc.FakeUnitsStart)                
 | 
					  if (SubAlloc.pText >= SubAlloc.FakeUnitsStart)                
 | 
				
			||||||
    goto RESTART_MODEL;
 | 
					    goto RESTART_MODEL;
 | 
				
			||||||
  if ( fs.Successor ) 
 | 
					  if ( fs.Successor ) 
 | 
				
			||||||
| 
						 | 
					@ -295,7 +310,7 @@ inline void ModelPPM::UpdateModel()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      if ((ns1 & 1) == 0) 
 | 
					      if ((ns1 & 1) == 0) 
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        pc->U.Stats=(STATE*) SubAlloc.ExpandUnits(pc->U.Stats,ns1 >> 1);
 | 
					        pc->U.Stats=(RARPPM_STATE*) SubAlloc.ExpandUnits(pc->U.Stats,ns1 >> 1);
 | 
				
			||||||
        if ( !pc->U.Stats )           
 | 
					        if ( !pc->U.Stats )           
 | 
				
			||||||
          goto RESTART_MODEL;
 | 
					          goto RESTART_MODEL;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -303,7 +318,7 @@ inline void ModelPPM::UpdateModel()
 | 
				
			||||||
    } 
 | 
					    } 
 | 
				
			||||||
    else 
 | 
					    else 
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      p=(STATE*) SubAlloc.AllocUnits(1);
 | 
					      p=(RARPPM_STATE*) SubAlloc.AllocUnits(1);
 | 
				
			||||||
      if ( !p )
 | 
					      if ( !p )
 | 
				
			||||||
        goto RESTART_MODEL;
 | 
					        goto RESTART_MODEL;
 | 
				
			||||||
      *p=pc->OneState;
 | 
					      *p=pc->OneState;
 | 
				
			||||||
| 
						 | 
					@ -346,9 +361,9 @@ static const byte ExpEscape[16]={ 25,14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void PPM_CONTEXT::decodeBinSymbol(ModelPPM *Model)
 | 
					inline void RARPPM_CONTEXT::decodeBinSymbol(ModelPPM *Model)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  STATE& rs=OneState;
 | 
					  RARPPM_STATE& rs=OneState;
 | 
				
			||||||
  Model->HiBitsFlag=Model->HB2Flag[Model->FoundState->Symbol];
 | 
					  Model->HiBitsFlag=Model->HB2Flag[Model->FoundState->Symbol];
 | 
				
			||||||
  ushort& bs=Model->BinSumm[rs.Freq-1][Model->PrevSuccess+
 | 
					  ushort& bs=Model->BinSumm[rs.Freq-1][Model->PrevSuccess+
 | 
				
			||||||
           Model->NS2BSIndx[Suffix->NumStats-1]+
 | 
					           Model->NS2BSIndx[Suffix->NumStats-1]+
 | 
				
			||||||
| 
						 | 
					@ -360,14 +375,14 @@ inline void PPM_CONTEXT::decodeBinSymbol(ModelPPM *Model)
 | 
				
			||||||
    rs.Freq += (rs.Freq < 128);
 | 
					    rs.Freq += (rs.Freq < 128);
 | 
				
			||||||
    Model->Coder.SubRange.LowCount=0;
 | 
					    Model->Coder.SubRange.LowCount=0;
 | 
				
			||||||
    Model->Coder.SubRange.HighCount=bs;
 | 
					    Model->Coder.SubRange.HighCount=bs;
 | 
				
			||||||
    bs = SHORT16(bs+INTERVAL-GET_MEAN(bs,PERIOD_BITS,2));
 | 
					    bs = GET_SHORT16(bs+INTERVAL-GET_MEAN(bs,PERIOD_BITS,2));
 | 
				
			||||||
    Model->PrevSuccess=1;
 | 
					    Model->PrevSuccess=1;
 | 
				
			||||||
    Model->RunLength++;
 | 
					    Model->RunLength++;
 | 
				
			||||||
  } 
 | 
					  } 
 | 
				
			||||||
  else 
 | 
					  else 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    Model->Coder.SubRange.LowCount=bs;
 | 
					    Model->Coder.SubRange.LowCount=bs;
 | 
				
			||||||
    bs = SHORT16(bs-GET_MEAN(bs,PERIOD_BITS,2));
 | 
					    bs = GET_SHORT16(bs-GET_MEAN(bs,PERIOD_BITS,2));
 | 
				
			||||||
    Model->Coder.SubRange.HighCount=BIN_SCALE;
 | 
					    Model->Coder.SubRange.HighCount=BIN_SCALE;
 | 
				
			||||||
    Model->InitEsc=ExpEscape[bs >> 10];
 | 
					    Model->InitEsc=ExpEscape[bs >> 10];
 | 
				
			||||||
    Model->NumMasked=1;
 | 
					    Model->NumMasked=1;
 | 
				
			||||||
| 
						 | 
					@ -378,7 +393,7 @@ inline void PPM_CONTEXT::decodeBinSymbol(ModelPPM *Model)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void PPM_CONTEXT::update1(ModelPPM *Model,STATE* p)
 | 
					inline void RARPPM_CONTEXT::update1(ModelPPM *Model,RARPPM_STATE* p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  (Model->FoundState=p)->Freq += 4;              
 | 
					  (Model->FoundState=p)->Freq += 4;              
 | 
				
			||||||
  U.SummFreq += 4;
 | 
					  U.SummFreq += 4;
 | 
				
			||||||
| 
						 | 
					@ -394,10 +409,10 @@ inline void PPM_CONTEXT::update1(ModelPPM *Model,STATE* p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline bool PPM_CONTEXT::decodeSymbol1(ModelPPM *Model)
 | 
					inline bool RARPPM_CONTEXT::decodeSymbol1(ModelPPM *Model)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Model->Coder.SubRange.scale=U.SummFreq;
 | 
					  Model->Coder.SubRange.scale=U.SummFreq;
 | 
				
			||||||
  STATE* p=U.Stats;
 | 
					  RARPPM_STATE* p=U.Stats;
 | 
				
			||||||
  int i, HiCnt;
 | 
					  int i, HiCnt;
 | 
				
			||||||
  int count=Model->Coder.GetCurrentCount();
 | 
					  int count=Model->Coder.GetCurrentCount();
 | 
				
			||||||
  if (count>=(int)Model->Coder.SubRange.scale)
 | 
					  if (count>=(int)Model->Coder.SubRange.scale)
 | 
				
			||||||
| 
						 | 
					@ -439,7 +454,7 @@ inline bool PPM_CONTEXT::decodeSymbol1(ModelPPM *Model)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void PPM_CONTEXT::update2(ModelPPM *Model,STATE* p)
 | 
					inline void RARPPM_CONTEXT::update2(ModelPPM *Model,RARPPM_STATE* p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  (Model->FoundState=p)->Freq += 4;              
 | 
					  (Model->FoundState=p)->Freq += 4;              
 | 
				
			||||||
  U.SummFreq += 4;
 | 
					  U.SummFreq += 4;
 | 
				
			||||||
| 
						 | 
					@ -450,9 +465,9 @@ inline void PPM_CONTEXT::update2(ModelPPM *Model,STATE* p)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline SEE2_CONTEXT* PPM_CONTEXT::makeEscFreq2(ModelPPM *Model,int Diff)
 | 
					inline RARPPM_SEE2_CONTEXT* RARPPM_CONTEXT::makeEscFreq2(ModelPPM *Model,int Diff)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEE2_CONTEXT* psee2c;
 | 
					  RARPPM_SEE2_CONTEXT* psee2c;
 | 
				
			||||||
  if (NumStats != 256) 
 | 
					  if (NumStats != 256) 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    psee2c=Model->SEE2Cont[Model->NS2Indx[Diff-1]]+
 | 
					    psee2c=Model->SEE2Cont[Model->NS2Indx[Diff-1]]+
 | 
				
			||||||
| 
						 | 
					@ -472,11 +487,11 @@ inline SEE2_CONTEXT* PPM_CONTEXT::makeEscFreq2(ModelPPM *Model,int Diff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline bool PPM_CONTEXT::decodeSymbol2(ModelPPM *Model)
 | 
					inline bool RARPPM_CONTEXT::decodeSymbol2(ModelPPM *Model)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int count, HiCnt, i=NumStats-Model->NumMasked;
 | 
					  int count, HiCnt, i=NumStats-Model->NumMasked;
 | 
				
			||||||
  SEE2_CONTEXT* psee2c=makeEscFreq2(Model,i);
 | 
					  RARPPM_SEE2_CONTEXT* psee2c=makeEscFreq2(Model,i);
 | 
				
			||||||
  STATE* ps[256], ** pps=ps, * p=U.Stats-1;
 | 
					  RARPPM_STATE* ps[256], ** pps=ps, * p=U.Stats-1;
 | 
				
			||||||
  HiCnt=0;
 | 
					  HiCnt=0;
 | 
				
			||||||
  do 
 | 
					  do 
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					@ -485,6 +500,12 @@ inline bool PPM_CONTEXT::decodeSymbol2(ModelPPM *Model)
 | 
				
			||||||
      p++; 
 | 
					      p++; 
 | 
				
			||||||
    } while (Model->CharMask[p->Symbol] == Model->EscCount);
 | 
					    } while (Model->CharMask[p->Symbol] == Model->EscCount);
 | 
				
			||||||
    HiCnt += p->Freq;
 | 
					    HiCnt += p->Freq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // We do not reuse PPMd coder in unstable state, so we do not really need
 | 
				
			||||||
 | 
					    // this check and added it for extra safety. See CVE-2017-17969 for details.
 | 
				
			||||||
 | 
					    if (pps>=ps+ASIZE(ps))
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *pps++ = p;
 | 
					    *pps++ = p;
 | 
				
			||||||
  } while ( --i );
 | 
					  } while ( --i );
 | 
				
			||||||
  Model->Coder.SubRange.scale += HiCnt;
 | 
					  Model->Coder.SubRange.scale += HiCnt;
 | 
				
			||||||
| 
						 | 
					@ -496,7 +517,12 @@ inline bool PPM_CONTEXT::decodeSymbol2(ModelPPM *Model)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    HiCnt=0;
 | 
					    HiCnt=0;
 | 
				
			||||||
    while ((HiCnt += p->Freq) <= count) 
 | 
					    while ((HiCnt += p->Freq) <= count) 
 | 
				
			||||||
      p=*++pps;
 | 
					    {
 | 
				
			||||||
 | 
					      pps++;
 | 
				
			||||||
 | 
					      if (pps>=ps+ASIZE(ps)) // Extra safety check.
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      p=*pps;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    Model->Coder.SubRange.LowCount = (Model->Coder.SubRange.HighCount=HiCnt)-p->Freq;
 | 
					    Model->Coder.SubRange.LowCount = (Model->Coder.SubRange.HighCount=HiCnt)-p->Freq;
 | 
				
			||||||
    psee2c->update();
 | 
					    psee2c->update();
 | 
				
			||||||
    update2(Model,p);
 | 
					    update2(Model,p);
 | 
				
			||||||
| 
						 | 
					@ -509,12 +535,15 @@ inline bool PPM_CONTEXT::decodeSymbol2(ModelPPM *Model)
 | 
				
			||||||
    pps--;
 | 
					    pps--;
 | 
				
			||||||
    do 
 | 
					    do 
 | 
				
			||||||
    { 
 | 
					    { 
 | 
				
			||||||
      Model->CharMask[(*++pps)->Symbol]=Model->EscCount; 
 | 
					      pps++;
 | 
				
			||||||
 | 
					      if (pps>=ps+ASIZE(ps)) // Extra safety check.
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      Model->CharMask[(*pps)->Symbol]=Model->EscCount; 
 | 
				
			||||||
    } while ( --i );
 | 
					    } while ( --i );
 | 
				
			||||||
    psee2c->Summ += Model->Coder.SubRange.scale;
 | 
					    psee2c->Summ += Model->Coder.SubRange.scale;
 | 
				
			||||||
    Model->NumMasked = NumStats;
 | 
					    Model->NumMasked = NumStats;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return(true);
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,16 +4,17 @@
 | 
				
			||||||
#include "coder.hpp"
 | 
					#include "coder.hpp"
 | 
				
			||||||
#include "suballoc.hpp"
 | 
					#include "suballoc.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const int MAX_O=64;                   /* maximum allowed model order */
 | 
					#ifdef ALLOW_MISALIGNED
 | 
				
			||||||
 | 
					 | 
				
			||||||
const int INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS,
 | 
					 | 
				
			||||||
          INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef STRICT_ALIGNMENT_REQUIRED
 | 
					 | 
				
			||||||
#pragma pack(1)
 | 
					#pragma pack(1)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct SEE2_CONTEXT
 | 
					struct RARPPM_DEF
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  static const int INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS,
 | 
				
			||||||
 | 
					    INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RARPPM_SEE2_CONTEXT : RARPPM_DEF
 | 
				
			||||||
{ // SEE-contexts for PPM-contexts with masked symbols
 | 
					{ // SEE-contexts for PPM-contexts with masked symbols
 | 
				
			||||||
  ushort Summ;
 | 
					  ushort Summ;
 | 
				
			||||||
  byte Shift, Count;
 | 
					  byte Shift, Count;
 | 
				
			||||||
| 
						 | 
					@ -24,7 +25,7 @@ struct SEE2_CONTEXT
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  uint getMean()
 | 
					  uint getMean()
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    uint RetVal=SHORT16(Summ) >> Shift;
 | 
					    uint RetVal=GET_SHORT16(Summ) >> Shift;
 | 
				
			||||||
    Summ -= RetVal;
 | 
					    Summ -= RetVal;
 | 
				
			||||||
    return RetVal+(RetVal == 0);
 | 
					    return RetVal+(RetVal == 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -40,45 +41,47 @@ struct SEE2_CONTEXT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ModelPPM;
 | 
					class ModelPPM;
 | 
				
			||||||
struct PPM_CONTEXT;
 | 
					struct RARPPM_CONTEXT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct STATE
 | 
					struct RARPPM_STATE
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  byte Symbol;
 | 
					  byte Symbol;
 | 
				
			||||||
  byte Freq;
 | 
					  byte Freq;
 | 
				
			||||||
  PPM_CONTEXT* Successor;
 | 
					  RARPPM_CONTEXT* Successor;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct FreqData
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  ushort SummFreq;
 | 
					 | 
				
			||||||
  STATE _PACK_ATTR * Stats;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct PPM_CONTEXT 
 | 
					struct RARPPM_CONTEXT : RARPPM_DEF
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ushort NumStats;
 | 
					    ushort NumStats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct FreqData
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ushort SummFreq;
 | 
				
			||||||
 | 
					      RARPPM_STATE RARPPM_PACK_ATTR * Stats;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    union
 | 
					    union
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      FreqData U;
 | 
					      FreqData U;
 | 
				
			||||||
      STATE OneState;
 | 
					      RARPPM_STATE OneState;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PPM_CONTEXT* Suffix;
 | 
					    RARPPM_CONTEXT* Suffix;
 | 
				
			||||||
    inline void encodeBinSymbol(ModelPPM *Model,int symbol);  // MaxOrder:
 | 
					    inline void encodeBinSymbol(ModelPPM *Model,int symbol);  // MaxOrder:
 | 
				
			||||||
    inline void encodeSymbol1(ModelPPM *Model,int symbol);    //  ABCD    context
 | 
					    inline void encodeSymbol1(ModelPPM *Model,int symbol);    //  ABCD    context
 | 
				
			||||||
    inline void encodeSymbol2(ModelPPM *Model,int symbol);    //   BCD    suffix
 | 
					    inline void encodeSymbol2(ModelPPM *Model,int symbol);    //   BCD    suffix
 | 
				
			||||||
    inline void decodeBinSymbol(ModelPPM *Model);  //   BCDE   successor
 | 
					    inline void decodeBinSymbol(ModelPPM *Model);  //   BCDE   successor
 | 
				
			||||||
    inline bool decodeSymbol1(ModelPPM *Model);    // other orders:
 | 
					    inline bool decodeSymbol1(ModelPPM *Model);    // other orders:
 | 
				
			||||||
    inline bool decodeSymbol2(ModelPPM *Model);    //   BCD    context
 | 
					    inline bool decodeSymbol2(ModelPPM *Model);    //   BCD    context
 | 
				
			||||||
    inline void update1(ModelPPM *Model,STATE* p); //    CD    suffix
 | 
					    inline void update1(ModelPPM *Model,RARPPM_STATE* p); //    CD    suffix
 | 
				
			||||||
    inline void update2(ModelPPM *Model,STATE* p); //   BCDE   successor
 | 
					    inline void update2(ModelPPM *Model,RARPPM_STATE* p); //   BCDE   successor
 | 
				
			||||||
    void rescale(ModelPPM *Model);
 | 
					    void rescale(ModelPPM *Model);
 | 
				
			||||||
    inline PPM_CONTEXT* createChild(ModelPPM *Model,STATE* pStats,STATE& FirstState);
 | 
					    inline RARPPM_CONTEXT* createChild(ModelPPM *Model,RARPPM_STATE* pStats,RARPPM_STATE& FirstState);
 | 
				
			||||||
    inline SEE2_CONTEXT* makeEscFreq2(ModelPPM *Model,int Diff);
 | 
					    inline RARPPM_SEE2_CONTEXT* makeEscFreq2(ModelPPM *Model,int Diff);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef STRICT_ALIGNMENT_REQUIRED
 | 
					#ifdef ALLOW_MISALIGNED
 | 
				
			||||||
#ifdef _AIX
 | 
					#ifdef _AIX
 | 
				
			||||||
#pragma pack(pop)
 | 
					#pragma pack(pop)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					@ -86,28 +89,15 @@ struct PPM_CONTEXT
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const uint UNIT_SIZE=Max(sizeof(PPM_CONTEXT),sizeof(RAR_MEM_BLK));
 | 
					class ModelPPM : RARPPM_DEF
 | 
				
			||||||
const uint FIXED_UNIT_SIZE=12;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
inline PPM_CONTEXT::PPM_CONTEXT(STATE* pStats,PPM_CONTEXT* ShorterContext):
 | 
					 | 
				
			||||||
        NumStats(1), Suffix(ShorterContext) { pStats->Successor=this; }
 | 
					 | 
				
			||||||
inline PPM_CONTEXT::PPM_CONTEXT(): NumStats(0) {}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template <class T>
 | 
					 | 
				
			||||||
inline void _PPMD_SWAP(T& t1,T& t2) { T tmp=t1; t1=t2; t2=tmp; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ModelPPM
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    friend struct PPM_CONTEXT;
 | 
					    friend struct RARPPM_CONTEXT;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    SEE2_CONTEXT SEE2Cont[25][16], DummySEE2Cont;
 | 
					    RARPPM_SEE2_CONTEXT SEE2Cont[25][16], DummySEE2Cont;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    struct PPM_CONTEXT *MinContext, *MedContext, *MaxContext;
 | 
					    struct RARPPM_CONTEXT *MinContext, *MedContext, *MaxContext;
 | 
				
			||||||
    STATE* FoundState;      // found next state transition
 | 
					    RARPPM_STATE* FoundState;      // found next state transition
 | 
				
			||||||
    int NumMasked, InitEsc, OrderFall, MaxOrder, RunLength, InitRL;
 | 
					    int NumMasked, InitEsc, OrderFall, MaxOrder, RunLength, InitRL;
 | 
				
			||||||
    byte CharMask[256], NS2Indx[256], NS2BSIndx[256], HB2Flag[256];
 | 
					    byte CharMask[256], NS2Indx[256], NS2BSIndx[256], HB2Flag[256];
 | 
				
			||||||
    byte EscCount, PrevSuccess, HiBitsFlag;
 | 
					    byte EscCount, PrevSuccess, HiBitsFlag;
 | 
				
			||||||
| 
						 | 
					@ -118,7 +108,7 @@ class ModelPPM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void RestartModelRare();
 | 
					    void RestartModelRare();
 | 
				
			||||||
    void StartModelRare(int MaxOrder);
 | 
					    void StartModelRare(int MaxOrder);
 | 
				
			||||||
    inline PPM_CONTEXT* CreateSuccessors(bool Skip,STATE* p1);
 | 
					    inline RARPPM_CONTEXT* CreateSuccessors(bool Skip,RARPPM_STATE* p1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inline void UpdateModel();
 | 
					    inline void UpdateModel();
 | 
				
			||||||
    inline void ClearMask();
 | 
					    inline void ClearMask();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2390
									
								
								libunrar/msc.dep
								
								
								
								
							
							
						
						
									
										2390
									
								
								libunrar/msc.dep
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -8,6 +8,8 @@ RAROptions::RAROptions()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RAROptions::~RAROptions()
 | 
					RAROptions::~RAROptions()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  // It is important for security reasons, so we do not have the unnecessary
 | 
				
			||||||
 | 
					  // password data left in memory.
 | 
				
			||||||
  memset(this,0,sizeof(RAROptions));
 | 
					  memset(this,0,sizeof(RAROptions));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,14 +17,19 @@ RAROptions::~RAROptions()
 | 
				
			||||||
void RAROptions::Init()
 | 
					void RAROptions::Init()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  memset(this,0,sizeof(RAROptions));
 | 
					  memset(this,0,sizeof(RAROptions));
 | 
				
			||||||
  WinSize=0x400000;
 | 
					  WinSize=0x2000000;
 | 
				
			||||||
  Overwrite=OVERWRITE_DEFAULT;
 | 
					  Overwrite=OVERWRITE_DEFAULT;
 | 
				
			||||||
  Method=3;
 | 
					  Method=3;
 | 
				
			||||||
  MsgStream=MSG_STDOUT;
 | 
					  MsgStream=MSG_STDOUT;
 | 
				
			||||||
  ConvertNames=NAMES_ORIGINALCASE;
 | 
					  ConvertNames=NAMES_ORIGINALCASE;
 | 
				
			||||||
  ProcessEA=true;
 | 
					  xmtime=EXTTIME_MAX;
 | 
				
			||||||
  xmtime=EXTTIME_HIGH3;
 | 
					 | 
				
			||||||
  CurVolNum=0;
 | 
					 | 
				
			||||||
  FileSizeLess=INT64NDF;
 | 
					  FileSizeLess=INT64NDF;
 | 
				
			||||||
  FileSizeMore=INT64NDF;
 | 
					  FileSizeMore=INT64NDF;
 | 
				
			||||||
 | 
					  HashType=HASH_CRC32;
 | 
				
			||||||
 | 
					#ifdef RAR_SMP
 | 
				
			||||||
 | 
					  Threads=GetNumberOfThreads();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef USE_QOPEN
 | 
				
			||||||
 | 
					  QOpenMode=QOPEN_AUTO;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,27 +1,32 @@
 | 
				
			||||||
#ifndef _RAR_OPTIONS_
 | 
					#ifndef _RAR_OPTIONS_
 | 
				
			||||||
#define _RAR_OPTIONS_
 | 
					#define _RAR_OPTIONS_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEFAULT_RECOVERY    -1
 | 
					#define DEFAULT_RECOVERY     -3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEFAULT_RECVOLUMES  -10
 | 
					#define DEFAULT_RECVOLUMES  -10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VOLSIZE_AUTO   INT64NDF // Automatically detect the volume size.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum PATH_EXCL_MODE {
 | 
					enum PATH_EXCL_MODE {
 | 
				
			||||||
  EXCL_NONE,EXCL_BASEPATH,EXCL_SKIPWHOLEPATH,EXCL_SAVEFULLPATH,
 | 
					  EXCL_UNCHANGED=0,    // Process paths as is (default).
 | 
				
			||||||
  EXCL_SKIPABSPATH,EXCL_ABSPATH
 | 
					  EXCL_SKIPWHOLEPATH,  // -ep  (exclude the path completely)
 | 
				
			||||||
 | 
					  EXCL_BASEPATH,       // -ep1 (exclude the base part of path)
 | 
				
			||||||
 | 
					  EXCL_SAVEFULLPATH,   // -ep2 (the full path without the disk letter)
 | 
				
			||||||
 | 
					  EXCL_ABSPATH         // -ep3 (the full path with the disk letter)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {SOLID_NONE=0,SOLID_NORMAL=1,SOLID_COUNT=2,SOLID_FILEEXT=4,
 | 
					enum {SOLID_NONE=0,SOLID_NORMAL=1,SOLID_COUNT=2,SOLID_FILEEXT=4,
 | 
				
			||||||
      SOLID_VOLUME_DEPENDENT=8,SOLID_VOLUME_INDEPENDENT=16};
 | 
					      SOLID_VOLUME_DEPENDENT=8,SOLID_VOLUME_INDEPENDENT=16};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {ARCTIME_NONE,ARCTIME_KEEP,ARCTIME_LATEST};
 | 
					enum {ARCTIME_NONE=0,ARCTIME_KEEP,ARCTIME_LATEST};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum EXTTIME_MODE {
 | 
					enum EXTTIME_MODE {
 | 
				
			||||||
  EXTTIME_NONE,EXTTIME_1S,EXTTIME_HIGH1,EXTTIME_HIGH2,EXTTIME_HIGH3
 | 
					  EXTTIME_NONE=0,EXTTIME_1S,EXTTIME_MAX
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {NAMES_ORIGINALCASE,NAMES_UPPERCASE,NAMES_LOWERCASE};
 | 
					enum {NAMES_ORIGINALCASE=0,NAMES_UPPERCASE,NAMES_LOWERCASE};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum MESSAGE_TYPE {MSG_STDOUT,MSG_STDERR,MSG_ERRONLY,MSG_NULL};
 | 
					enum MESSAGE_TYPE {MSG_STDOUT=0,MSG_STDERR,MSG_ERRONLY,MSG_NULL};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum RECURSE_MODE 
 | 
					enum RECURSE_MODE 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -33,19 +38,41 @@ enum RECURSE_MODE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum OVERWRITE_MODE 
 | 
					enum OVERWRITE_MODE 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  OVERWRITE_DEFAULT=0, // ask for extraction, silently overwrite for archiving
 | 
					  OVERWRITE_DEFAULT=0, // Ask when extracting, silently overwrite when archiving.
 | 
				
			||||||
  OVERWRITE_ALL,
 | 
					  OVERWRITE_ALL,
 | 
				
			||||||
  OVERWRITE_NONE,
 | 
					  OVERWRITE_NONE,
 | 
				
			||||||
  OVERWRITE_AUTORENAME,
 | 
					  OVERWRITE_AUTORENAME,
 | 
				
			||||||
  OVERWRITE_FORCE_ASK
 | 
					  OVERWRITE_FORCE_ASK
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum RAR_CHARSET { RCH_DEFAULT=0,RCH_ANSI,RCH_OEM,RCH_UNICODE };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define     MAX_FILTERS           16
 | 
					enum QOPEN_MODE { QOPEN_NONE, QOPEN_AUTO, QOPEN_ALWAYS };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum RAR_CHARSET { RCH_DEFAULT=0,RCH_ANSI,RCH_OEM,RCH_UNICODE,RCH_UTF8 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define     MAX_FILTER_TYPES           16
 | 
				
			||||||
enum FilterState {FILTER_DEFAULT=0,FILTER_AUTO,FILTER_FORCE,FILTER_DISABLE};
 | 
					enum FilterState {FILTER_DEFAULT=0,FILTER_AUTO,FILTER_FORCE,FILTER_DISABLE};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum SAVECOPY_MODE {
 | 
				
			||||||
 | 
					  SAVECOPY_NONE=0, SAVECOPY_SILENT, SAVECOPY_LIST, SAVECOPY_LISTEXIT,
 | 
				
			||||||
 | 
					  SAVECOPY_DUPLISTEXIT
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum APPENDARCNAME_MODE
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  APPENDARCNAME_NONE=0,APPENDARCNAME_DESTPATH,APPENDARCNAME_OWNDIR
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum POWER_MODE {
 | 
				
			||||||
 | 
					  POWERMODE_KEEP=0,POWERMODE_OFF,POWERMODE_HIBERNATE,POWERMODE_SLEEP,
 | 
				
			||||||
 | 
					  POWERMODE_RESTART
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Need "forced off" state to turn off sound in GUI command line.
 | 
				
			||||||
 | 
					enum SOUND_NOTIFY_MODE {SOUND_NOTIFY_DEFAULT=0,SOUND_NOTIFY_ON,SOUND_NOTIFY_OFF};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct FilterMode
 | 
					struct FilterMode
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  FilterState State;
 | 
					  FilterState State;
 | 
				
			||||||
| 
						 | 
					@ -53,6 +80,8 @@ struct FilterMode
 | 
				
			||||||
  int Param2;
 | 
					  int Param2;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_GENERATE_MASK  128
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RAROptions
 | 
					class RAROptions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -63,34 +92,51 @@ class RAROptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint ExclFileAttr;
 | 
					    uint ExclFileAttr;
 | 
				
			||||||
    uint InclFileAttr;
 | 
					    uint InclFileAttr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // We handle -ed and -e+d with special flags instead of attribute mask,
 | 
				
			||||||
 | 
					    // so it works with both Windows and Unix archives.
 | 
				
			||||||
 | 
					    bool ExclDir;
 | 
				
			||||||
 | 
					    bool InclDir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool InclAttrSet;
 | 
					    bool InclAttrSet;
 | 
				
			||||||
    uint WinSize;
 | 
					    size_t WinSize;
 | 
				
			||||||
    char TempPath[NM];
 | 
					    wchar TempPath[NM];
 | 
				
			||||||
    char SFXModule[NM];
 | 
					    wchar SFXModule[NM];
 | 
				
			||||||
    char ExtrPath[NM];
 | 
					
 | 
				
			||||||
    wchar ExtrPathW[NM];
 | 
					#ifdef USE_QOPEN
 | 
				
			||||||
    char CommentFile[NM];
 | 
					    QOPEN_MODE QOpenMode;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool ConfigDisabled; // Switch -cfg-.
 | 
				
			||||||
 | 
					    wchar ExtrPath[NM];
 | 
				
			||||||
 | 
					    wchar CommentFile[NM];
 | 
				
			||||||
    RAR_CHARSET CommentCharset;
 | 
					    RAR_CHARSET CommentCharset;
 | 
				
			||||||
    RAR_CHARSET FilelistCharset;
 | 
					    RAR_CHARSET FilelistCharset;
 | 
				
			||||||
    char ArcPath[NM];
 | 
					    RAR_CHARSET ErrlogCharset;
 | 
				
			||||||
    wchar ArcPathW[NM];
 | 
					    RAR_CHARSET RedirectCharset;
 | 
				
			||||||
    char Password[MAXPASSWORD];
 | 
					
 | 
				
			||||||
 | 
					    wchar ArcPath[NM];
 | 
				
			||||||
 | 
					    SecPassword Password;
 | 
				
			||||||
    bool EncryptHeaders;
 | 
					    bool EncryptHeaders;
 | 
				
			||||||
    char LogName[NM];
 | 
					    
 | 
				
			||||||
 | 
					    bool ManualPassword; // Password entered manually during operation, might need to clean for next archive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wchar LogName[NM];
 | 
				
			||||||
    MESSAGE_TYPE MsgStream;
 | 
					    MESSAGE_TYPE MsgStream;
 | 
				
			||||||
    bool Sound;
 | 
					    SOUND_NOTIFY_MODE Sound;
 | 
				
			||||||
    OVERWRITE_MODE Overwrite;
 | 
					    OVERWRITE_MODE Overwrite;
 | 
				
			||||||
    int Method;
 | 
					    int Method;
 | 
				
			||||||
 | 
					    HASH_TYPE HashType;
 | 
				
			||||||
    int Recovery;
 | 
					    int Recovery;
 | 
				
			||||||
    int RecVolNumber;
 | 
					    int RecVolNumber;
 | 
				
			||||||
    bool DisablePercentage;
 | 
					    bool DisablePercentage;
 | 
				
			||||||
    bool DisableCopyright;
 | 
					    bool DisableCopyright;
 | 
				
			||||||
    bool DisableDone;
 | 
					    bool DisableDone;
 | 
				
			||||||
 | 
					    bool PrintVersion;
 | 
				
			||||||
    int Solid;
 | 
					    int Solid;
 | 
				
			||||||
    int SolidCount;
 | 
					    int SolidCount;
 | 
				
			||||||
    bool ClearArc;
 | 
					    bool ClearArc;
 | 
				
			||||||
    bool AddArcOnly;
 | 
					    bool AddArcOnly;
 | 
				
			||||||
    bool AV;
 | 
					 | 
				
			||||||
    bool DisableComment;
 | 
					    bool DisableComment;
 | 
				
			||||||
    bool FreshFiles;
 | 
					    bool FreshFiles;
 | 
				
			||||||
    bool UpdateFiles;
 | 
					    bool UpdateFiles;
 | 
				
			||||||
| 
						 | 
					@ -100,55 +146,63 @@ class RAROptions
 | 
				
			||||||
    Array<int64> NextVolSizes;
 | 
					    Array<int64> NextVolSizes;
 | 
				
			||||||
    uint CurVolNum;
 | 
					    uint CurVolNum;
 | 
				
			||||||
    bool AllYes;
 | 
					    bool AllYes;
 | 
				
			||||||
    bool DisableViewAV;
 | 
					    bool MoreInfo; // -im, show more information, used only in "WinRAR t" now.
 | 
				
			||||||
    bool DisableSortSolid;
 | 
					    bool DisableSortSolid;
 | 
				
			||||||
    int ArcTime;
 | 
					    int ArcTime;
 | 
				
			||||||
    int ConvertNames;
 | 
					    int ConvertNames;
 | 
				
			||||||
    bool ProcessOwners;
 | 
					    bool ProcessOwners;
 | 
				
			||||||
    bool SaveLinks;
 | 
					    bool SaveSymLinks;
 | 
				
			||||||
 | 
					    bool SaveHardLinks;
 | 
				
			||||||
 | 
					    bool AbsoluteLinks;
 | 
				
			||||||
    int Priority;
 | 
					    int Priority;
 | 
				
			||||||
    int SleepTime;
 | 
					    int SleepTime;
 | 
				
			||||||
    bool KeepBroken;
 | 
					    bool KeepBroken;
 | 
				
			||||||
    bool EraseDisk;
 | 
					 | 
				
			||||||
    bool OpenShared;
 | 
					    bool OpenShared;
 | 
				
			||||||
    bool DeleteFiles;
 | 
					    bool DeleteFiles;
 | 
				
			||||||
    bool SyncFiles;
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					    bool AllowIncompatNames; // Allow names with trailing dots and spaces.
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
    bool GenerateArcName;
 | 
					    bool GenerateArcName;
 | 
				
			||||||
    char GenerateMask[80];
 | 
					    wchar GenerateMask[MAX_GENERATE_MASK];
 | 
				
			||||||
 | 
					    wchar DefGenerateMask[MAX_GENERATE_MASK];
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    bool SyncFiles;
 | 
				
			||||||
    bool ProcessEA;
 | 
					    bool ProcessEA;
 | 
				
			||||||
    bool SaveStreams;
 | 
					    bool SaveStreams;
 | 
				
			||||||
    bool SetCompressedAttr;
 | 
					    bool SetCompressedAttr;
 | 
				
			||||||
    bool IgnoreGeneralAttr;
 | 
					    bool IgnoreGeneralAttr;
 | 
				
			||||||
    RarTime FileTimeBefore;
 | 
					    RarTime FileMtimeBefore,FileCtimeBefore,FileAtimeBefore;
 | 
				
			||||||
    RarTime FileTimeAfter;
 | 
					    bool FileMtimeBeforeOR,FileCtimeBeforeOR,FileAtimeBeforeOR;
 | 
				
			||||||
 | 
					    RarTime FileMtimeAfter,FileCtimeAfter,FileAtimeAfter;
 | 
				
			||||||
 | 
					    bool FileMtimeAfterOR,FileCtimeAfterOR,FileAtimeAfterOR;
 | 
				
			||||||
    int64 FileSizeLess;
 | 
					    int64 FileSizeLess;
 | 
				
			||||||
    int64 FileSizeMore;
 | 
					    int64 FileSizeMore;
 | 
				
			||||||
    bool OldNumbering;
 | 
					 | 
				
			||||||
    bool Lock;
 | 
					    bool Lock;
 | 
				
			||||||
    bool Test;
 | 
					    bool Test;
 | 
				
			||||||
    bool VolumePause;
 | 
					    bool VolumePause;
 | 
				
			||||||
    FilterMode FilterModes[MAX_FILTERS];
 | 
					    FilterMode FilterModes[MAX_FILTER_TYPES];
 | 
				
			||||||
    char EmailTo[NM];
 | 
					    wchar EmailTo[NM];
 | 
				
			||||||
    uint VersionControl;
 | 
					    uint VersionControl;
 | 
				
			||||||
    bool NoEndBlock;
 | 
					    APPENDARCNAME_MODE AppendArcNameToPath;
 | 
				
			||||||
    bool AppendArcNameToPath;
 | 
					    POWER_MODE Shutdown;
 | 
				
			||||||
    bool Shutdown;
 | 
					    EXTTIME_MODE xmtime; // Extended time modes (time precision to store).
 | 
				
			||||||
    EXTTIME_MODE xmtime;
 | 
					 | 
				
			||||||
    EXTTIME_MODE xctime;
 | 
					    EXTTIME_MODE xctime;
 | 
				
			||||||
    EXTTIME_MODE xatime;
 | 
					    EXTTIME_MODE xatime;
 | 
				
			||||||
    EXTTIME_MODE xarctime;
 | 
					    bool PreserveAtime;
 | 
				
			||||||
    char CompressStdin[NM];
 | 
					    wchar CompressStdin[NM];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint Threads; // We use it to init hash even if RAR_SMP is not defined.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PACK_SMP
 | 
					 | 
				
			||||||
    uint Threads;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef RARDLL
 | 
					#ifdef RARDLL
 | 
				
			||||||
    char DllDestName[NM];
 | 
					    wchar DllDestName[NM];
 | 
				
			||||||
    wchar DllDestNameW[NM];
 | 
					 | 
				
			||||||
    int DllOpMode;
 | 
					    int DllOpMode;
 | 
				
			||||||
    int DllError;
 | 
					    int DllError;
 | 
				
			||||||
    LPARAM UserData;
 | 
					    LPARAM UserData;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										220
									
								
								libunrar/os.hpp
								
								
								
								
							
							
						
						
									
										220
									
								
								libunrar/os.hpp
								
								
								
								
							| 
						 | 
					@ -8,146 +8,132 @@
 | 
				
			||||||
  #define INCL_BASE
 | 
					  #define INCL_BASE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN_32) || defined(_EMX)
 | 
					#if defined(RARDLL) && !defined(SILENT)
 | 
				
			||||||
#define ENABLE_BAD_ALLOC
 | 
					#define SILENT
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <new>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN_32) || defined(_EMX)
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) || defined(_EMX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LITTLE_ENDIAN
 | 
					#define LITTLE_ENDIAN
 | 
				
			||||||
#define NM  1024
 | 
					#define NM  2048
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #define STRICT
 | 
					 | 
				
			||||||
  #undef WINVER
 | 
					 | 
				
			||||||
  #undef _WIN32_WINNT
 | 
					 | 
				
			||||||
  #define WINVER 0x0400
 | 
					 | 
				
			||||||
  #define _WIN32_WINNT 0x0300
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// We got a report that just "#define STRICT" is incompatible with
 | 
				
			||||||
 | 
					// "#define STRICT 1" in Windows 10 SDK minwindef.h and depending on the order
 | 
				
			||||||
 | 
					// in which these statements are reached this may cause a compiler warning
 | 
				
			||||||
 | 
					// and build break for other projects incorporating this source.
 | 
				
			||||||
 | 
					// So we changed it to "#define STRICT 1".
 | 
				
			||||||
 | 
					#ifndef STRICT
 | 
				
			||||||
 | 
					#define STRICT 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 'ifndef' check here is needed for unrar.dll header to avoid macro
 | 
				
			||||||
 | 
					// re-definition warnings in third party projects.
 | 
				
			||||||
 | 
					#ifndef UNICODE
 | 
				
			||||||
 | 
					#define UNICODE
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef WINVER
 | 
				
			||||||
 | 
					#undef _WIN32_WINNT
 | 
				
			||||||
 | 
					#define WINVER 0x0501
 | 
				
			||||||
 | 
					#define _WIN32_WINNT 0x0501
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(ZIPSFX)
 | 
				
			||||||
 | 
					#define RAR_SMP
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WIN32_LEAN_AND_MEAN
 | 
					#define WIN32_LEAN_AND_MEAN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
#include <prsht.h>
 | 
					#include <prsht.h>
 | 
				
			||||||
 | 
					#include <shlwapi.h>
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					#pragma comment(lib, "Shlwapi.lib")
 | 
				
			||||||
  #include <shellapi.h>
 | 
					#include <PowrProf.h>
 | 
				
			||||||
  #include <shlobj.h>
 | 
					#pragma comment(lib, "PowrProf.lib")
 | 
				
			||||||
  #include <winioctl.h>
 | 
					#include <shellapi.h>
 | 
				
			||||||
 | 
					#include <shlobj.h>
 | 
				
			||||||
 | 
					#include <winioctl.h>
 | 
				
			||||||
 | 
					#include <wincrypt.h>
 | 
				
			||||||
 | 
					#include <wchar.h>
 | 
				
			||||||
 | 
					#include <wctype.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // _WIN_CE
 | 
					#endif // _WIN_ALL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <dos.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // _WIN_32
 | 
					#if !defined(_EMX) && !defined(_MSC_VER)
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
  #include <sys/types.h>
 | 
					 | 
				
			||||||
  #include <sys/stat.h>
 | 
					 | 
				
			||||||
  #include <dos.h>
 | 
					 | 
				
			||||||
#endif // _WIN_CE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(_EMX) && !defined(_MSC_VER) && !defined(_WIN_CE)
 | 
					 | 
				
			||||||
  #include <dir.h>
 | 
					  #include <dir.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef _MSC_VER
 | 
					#ifdef _MSC_VER
 | 
				
			||||||
  #if _MSC_VER<1500
 | 
					  #if _MSC_VER<1500
 | 
				
			||||||
    #define for if (0) ; else for
 | 
					    #define for if (0) ; else for
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #ifndef _WIN_CE
 | 
					  #include <direct.h>
 | 
				
			||||||
    #include <direct.h>
 | 
					  #include <intrin.h>
 | 
				
			||||||
  #endif
 | 
					
 | 
				
			||||||
 | 
					  #define USE_SSE
 | 
				
			||||||
 | 
					  #define SSE_ALIGNMENT 16
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #include <dirent.h>
 | 
					  #include <dirent.h>
 | 
				
			||||||
#endif // _MSC_VER
 | 
					#endif // _MSC_VER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
  #include <share.h>
 | 
					 | 
				
			||||||
#endif // _WIN_CE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if defined(ENABLE_BAD_ALLOC) && !defined(_WIN_CE)
 | 
					 | 
				
			||||||
  #include <new.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef _EMX
 | 
					 | 
				
			||||||
  #include <unistd.h>
 | 
					 | 
				
			||||||
  #include <pwd.h>
 | 
					 | 
				
			||||||
  #include <grp.h>
 | 
					 | 
				
			||||||
  #include <errno.h>
 | 
					 | 
				
			||||||
  #ifdef _DJGPP
 | 
					 | 
				
			||||||
    #include <utime.h>
 | 
					 | 
				
			||||||
  #else
 | 
					 | 
				
			||||||
    #include <os2.h>
 | 
					 | 
				
			||||||
    #include <sys/utime.h>
 | 
					 | 
				
			||||||
    #include <emx/syscalls.h>
 | 
					 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  #if defined(_MSC_VER) || defined(__MINGW32__)
 | 
					 | 
				
			||||||
      #include <exception>
 | 
					 | 
				
			||||||
  #else
 | 
					 | 
				
			||||||
    #include <except.h>
 | 
					 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
#ifndef _WIN_CE
 | 
					#include <fcntl.h>
 | 
				
			||||||
  #include <fcntl.h>
 | 
					#include <dos.h>
 | 
				
			||||||
  #include <dos.h>
 | 
					#include <io.h>
 | 
				
			||||||
  #include <io.h>
 | 
					#include <time.h>
 | 
				
			||||||
  #include <time.h>
 | 
					#include <signal.h>
 | 
				
			||||||
  #include <signal.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#define SAVE_LINKS
 | 
				
			||||||
#pragma hdrstop
 | 
					 | 
				
			||||||
#endif // _WIN_32
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ENABLE_ACCESS
 | 
					#define ENABLE_ACCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DefConfigName  "rar.ini"
 | 
					#define DefConfigName  L"rar.ini"
 | 
				
			||||||
#define DefLogName     "rar.log"
 | 
					#define DefLogName     L"rar.log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PATHDIVIDER  "\\"
 | 
					#define SPATHDIVIDER L"\\"
 | 
				
			||||||
#define PATHDIVIDERW L"\\"
 | 
					 | 
				
			||||||
#define CPATHDIVIDER '\\'
 | 
					#define CPATHDIVIDER '\\'
 | 
				
			||||||
#define MASKALL      "*"
 | 
					#define MASKALL      L"*"
 | 
				
			||||||
#define MASKALLW     L"*"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define READBINARY   "rb"
 | 
					#define READBINARY   "rb"
 | 
				
			||||||
#define READTEXT     "rt"
 | 
					#define READTEXT     "rt"
 | 
				
			||||||
#define UPDATEBINARY "r+b"
 | 
					#define UPDATEBINARY "r+b"
 | 
				
			||||||
#define CREATEBINARY "w+b"
 | 
					#define CREATEBINARY "w+b"
 | 
				
			||||||
 | 
					#define WRITEBINARY  "wb"
 | 
				
			||||||
#define APPENDTEXT   "at"
 | 
					#define APPENDTEXT   "at"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN_32)
 | 
					#if defined(_WIN_ALL)
 | 
				
			||||||
  #ifdef _MSC_VER
 | 
					  #ifdef _MSC_VER
 | 
				
			||||||
    #define _stdfunction __cdecl
 | 
					    #define _stdfunction __cdecl
 | 
				
			||||||
 | 
					    #define _forceinline __forceinline
 | 
				
			||||||
  #else
 | 
					  #else
 | 
				
			||||||
    #define _stdfunction _USERENTRY
 | 
					    #define _stdfunction _USERENTRY
 | 
				
			||||||
 | 
					    #define _forceinline inline
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define _stdfunction
 | 
					  #define _stdfunction
 | 
				
			||||||
 | 
					  #define _forceinline inline
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif // defined(_WIN_ALL) || defined(_EMX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  NM  1024
 | 
					#define NM  2048
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef _BEOS
 | 
					 | 
				
			||||||
#include <be/kernel/fs_info.h>
 | 
					 | 
				
			||||||
#include <be/kernel/fs_attr.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
| 
						 | 
					@ -156,13 +142,16 @@
 | 
				
			||||||
#if defined(__QNXNTO__)
 | 
					#if defined(__QNXNTO__)
 | 
				
			||||||
  #include <sys/param.h>
 | 
					  #include <sys/param.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined(__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__)
 | 
					#if defined(RAR_SMP) && defined(__APPLE__)
 | 
				
			||||||
  #include <sys/param.h>
 | 
					  #include <sys/sysctl.h>
 | 
				
			||||||
  #include <sys/mount.h>
 | 
					#endif
 | 
				
			||||||
#else
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					    #include <sys/statvfs.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#include <pwd.h>
 | 
					#include <pwd.h>
 | 
				
			||||||
#include <grp.h>
 | 
					#include <grp.h>
 | 
				
			||||||
 | 
					#include <wchar.h>
 | 
				
			||||||
 | 
					#include <wctype.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
| 
						 | 
					@ -176,29 +165,35 @@
 | 
				
			||||||
#include <utime.h>
 | 
					#include <utime.h>
 | 
				
			||||||
#include <locale.h>
 | 
					#include <locale.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef  S_IFLNK
 | 
					#ifdef  S_IFLNK
 | 
				
			||||||
#define SAVE_LINKS
 | 
					#define SAVE_LINKS
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__linux) || defined(__FreeBSD__)
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#define USE_LUTIMES
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ENABLE_ACCESS
 | 
					#define ENABLE_ACCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DefConfigName  ".rarrc"
 | 
					#define DefConfigName  L".rarrc"
 | 
				
			||||||
#define DefLogName     ".rarlog"
 | 
					#define DefLogName     L".rarlog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PATHDIVIDER  "/"
 | 
					#define SPATHDIVIDER L"/"
 | 
				
			||||||
#define PATHDIVIDERW L"/"
 | 
					 | 
				
			||||||
#define CPATHDIVIDER '/'
 | 
					#define CPATHDIVIDER '/'
 | 
				
			||||||
#define MASKALL      "*"
 | 
					#define MASKALL      L"*"
 | 
				
			||||||
#define MASKALLW     L"*"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define READBINARY   "r"
 | 
					#define READBINARY   "r"
 | 
				
			||||||
#define READTEXT     "r"
 | 
					#define READTEXT     "r"
 | 
				
			||||||
#define UPDATEBINARY "r+"
 | 
					#define UPDATEBINARY "r+"
 | 
				
			||||||
#define CREATEBINARY "w+"
 | 
					#define CREATEBINARY "w+"
 | 
				
			||||||
 | 
					#define WRITEBINARY  "w"
 | 
				
			||||||
#define APPENDTEXT   "a"
 | 
					#define APPENDTEXT   "a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _stdfunction 
 | 
					#define _stdfunction 
 | 
				
			||||||
 | 
					#define _forceinline inline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _APPLE
 | 
					#ifdef _APPLE
 | 
				
			||||||
  #if defined(__BIG_ENDIAN__) && !defined(BIG_ENDIAN)
 | 
					  #if defined(__BIG_ENDIAN__) && !defined(BIG_ENDIAN)
 | 
				
			||||||
| 
						 | 
					@ -217,18 +212,39 @@
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if _POSIX_C_SOURCE >= 200809L
 | 
				
			||||||
 | 
					  #define UNIX_TIME_NS // Nanosecond time precision in Unix.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  typedef const char* MSGID;
 | 
					#endif // _UNIX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					  #define MSGID_INT
 | 
				
			||||||
 | 
					  typedef int MSGID;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  typedef const wchar* MSGID;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SSE_ALIGNMENT // No SSE use and no special data alignment is required.
 | 
				
			||||||
 | 
					  #define SSE_ALIGNMENT 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define safebuf static
 | 
					#define safebuf static
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Solaris defines _LITTLE_ENDIAN or _BIG_ENDIAN.
 | 
				
			||||||
 | 
					#if defined(_LITTLE_ENDIAN) && !defined(LITTLE_ENDIAN)
 | 
				
			||||||
 | 
					  #define LITTLE_ENDIAN
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined(_BIG_ENDIAN) && !defined(BIG_ENDIAN)
 | 
				
			||||||
 | 
					  #define BIG_ENDIAN
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
 | 
					#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
 | 
				
			||||||
  #if defined(__i386) || defined(i386) || defined(__i386__)
 | 
					  #if defined(__i386) || defined(i386) || defined(__i386__) || defined(__x86_64)
 | 
				
			||||||
    #define LITTLE_ENDIAN
 | 
					    #define LITTLE_ENDIAN
 | 
				
			||||||
  #elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN
 | 
					  #elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN || defined(__LITTLE_ENDIAN__)
 | 
				
			||||||
    #define LITTLE_ENDIAN
 | 
					    #define LITTLE_ENDIAN
 | 
				
			||||||
  #elif defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN
 | 
					  #elif defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN || defined(__BIG_ENDIAN__)
 | 
				
			||||||
    #define BIG_ENDIAN
 | 
					    #define BIG_ENDIAN
 | 
				
			||||||
  #else
 | 
					  #else
 | 
				
			||||||
    #error "Neither LITTLE_ENDIAN nor BIG_ENDIAN are defined. Define one of them."
 | 
					    #error "Neither LITTLE_ENDIAN nor BIG_ENDIAN are defined. Define one of them."
 | 
				
			||||||
| 
						 | 
					@ -245,15 +261,9 @@
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(BIG_ENDIAN) && !defined(_WIN_CE) && defined(_WIN_32)
 | 
					#if !defined(BIG_ENDIAN) && defined(_WIN_ALL) || defined(__i386__) || defined(__x86_64__)
 | 
				
			||||||
/* allow not aligned integer access, increases speed in some operations */
 | 
					// Allow not aligned integer access, increases speed in some operations.
 | 
				
			||||||
#define ALLOW_NOT_ALIGNED_INT
 | 
					#define ALLOW_MISALIGNED
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if defined(__sparc) || defined(sparc) || defined(__sparcv9)
 | 
					 | 
				
			||||||
/* prohibit not aligned access to data structures in text comression
 | 
					 | 
				
			||||||
   algorithm, increases memory requirements */
 | 
					 | 
				
			||||||
#define STRICT_ALIGNMENT_REQUIRED
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // _RAR_OS_
 | 
					#endif // _RAR_OS_
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,94 +0,0 @@
 | 
				
			||||||
#include <os2.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ExtractOS2EA(Archive &Arc,char *FileName)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (_osmode != OS2_MODE)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    mprintf(St(MSkipEA));
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Arc.HeaderCRC!=Arc.EAHead.HeadCRC)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MEABroken),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(CRC_ERROR);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Arc.EAHead.Method<0x31 || Arc.EAHead.Method>0x35 || Arc.EAHead.UnpVer>PACK_VER)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MEAUnknHeader),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  struct StructEAOP2
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    char *GEAPtr;
 | 
					 | 
				
			||||||
    char *FEAPtr;
 | 
					 | 
				
			||||||
    unsigned long Error;
 | 
					 | 
				
			||||||
  } EAOP2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ComprDataIO DataIO;
 | 
					 | 
				
			||||||
  Unpack Unpack(&DataIO);
 | 
					 | 
				
			||||||
  Unpack.Init();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Array<unsigned char> UnpData(Arc.EAHead.UnpSize);
 | 
					 | 
				
			||||||
  DataIO.SetUnpackToMemory(&UnpData[0],Arc.EAHead.UnpSize);
 | 
					 | 
				
			||||||
  DataIO.SetPackedSizeToRead(Arc.EAHead.DataSize);
 | 
					 | 
				
			||||||
  DataIO.EnableShowProgress(false);
 | 
					 | 
				
			||||||
  DataIO.SetFiles(&Arc,NULL);
 | 
					 | 
				
			||||||
  Unpack.SetDestSize(Arc.EAHead.UnpSize);
 | 
					 | 
				
			||||||
  Unpack.DoUnpack(Arc.EAHead.UnpVer,false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Arc.EAHead.EACRC!=~DataIO.UnpFileCRC)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MEABroken),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(CRC_ERROR);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EAOP2.FEAPtr=(char *)&UnpData[0];
 | 
					 | 
				
			||||||
  EAOP2.GEAPtr=NULL;
 | 
					 | 
				
			||||||
  if (DosSetPathInfo((unsigned char *)FileName,2,&EAOP2,sizeof(EAOP2),0x10)!=0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  File::SetCloseFileTimeByName(FileName,&Arc.NewLhd.mtime,&Arc.NewLhd.atime);
 | 
					 | 
				
			||||||
  mprintf(St(MShowEA));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ExtractOS2EANew(Archive &Arc,char *FileName)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (_osmode != OS2_MODE)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    mprintf(St(MSkipEA));
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Array<byte> SubData;
 | 
					 | 
				
			||||||
  if (!Arc.ReadSubData(&SubData,NULL))
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  struct StructEAOP2
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    char *GEAPtr;
 | 
					 | 
				
			||||||
    char *FEAPtr;
 | 
					 | 
				
			||||||
    unsigned long Error;
 | 
					 | 
				
			||||||
  } EAOP2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EAOP2.FEAPtr=(char *)&SubData[0];
 | 
					 | 
				
			||||||
  EAOP2.GEAPtr=NULL;
 | 
					 | 
				
			||||||
  if (DosSetPathInfo((unsigned char *)FileName,2,&EAOP2,sizeof(EAOP2),0x10)!=0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Log(Arc.FileName,St(MCannotSetEA),FileName);
 | 
					 | 
				
			||||||
    ErrHandler.SetErrorCode(WARNING);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  File::SetCloseFileTimeByName(FileName,&Arc.NewLhd.mtime,&Arc.NewLhd.atime);
 | 
					 | 
				
			||||||
  mprintf(St(MShowEA));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,44 +0,0 @@
 | 
				
			||||||
--- makefile.unix.orig	2008-10-09 15:43:06.000000000 +0200
 | 
					 | 
				
			||||||
+++ makefile.unix	2008-11-06 01:43:52.000000000 +0100
 | 
					 | 
				
			||||||
@@ -7,10 +7,11 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 # Linux using GCC
 | 
					 | 
				
			||||||
 #CXX=g++
 | 
					 | 
				
			||||||
-#CXXFLAGS=-O2
 | 
					 | 
				
			||||||
-DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 | 
					 | 
				
			||||||
+CXXFLAGS=$(CFLAGS) -fPIC -DPIC
 | 
					 | 
				
			||||||
+DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DGUI -DSILENT
 | 
					 | 
				
			||||||
 STRIP=strip
 | 
					 | 
				
			||||||
 DESTDIR=/usr
 | 
					 | 
				
			||||||
+RANLIB=ranlib
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 # Linux using LCC
 | 
					 | 
				
			||||||
 #CXX=lcc
 | 
					 | 
				
			||||||
@@ -100,7 +101,7 @@
 | 
					 | 
				
			||||||
 WHAT=UNRAR
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 UNRAR_OBJ=filestr.o recvol.o rs.o scantree.o
 | 
					 | 
				
			||||||
-LIB_OBJ=filestr.o scantree.o dll.o
 | 
					 | 
				
			||||||
+LIB_OBJ=dll.o
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 OBJECTS=rar.o strlist.o strfn.o pathfn.o int64.o savepos.o global.o file.o filefn.o filcreat.o \
 | 
					 | 
				
			||||||
 	archive.o arcread.o unicode.o system.o isnt.o crypt.o crc.o rawread.o encname.o \
 | 
					 | 
				
			||||||
@@ -131,9 +132,15 @@
 | 
					 | 
				
			||||||
 	$(STRIP) default.sfx
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 lib:	WHAT=RARDLL
 | 
					 | 
				
			||||||
-lib:	$(OBJECTS) $(LIB_OBJ)
 | 
					 | 
				
			||||||
-	@rm -f libunrar.so
 | 
					 | 
				
			||||||
-	$(LINK) -shared -o libunrar.so $(LDFLAGS) $(OBJECTS) $(LIB_OBJ)
 | 
					 | 
				
			||||||
+lib:	$(OBJECTS) $(LIB_OBJ) $(UNRAR_OBJ)
 | 
					 | 
				
			||||||
+	@rm -f libunrar.so.3
 | 
					 | 
				
			||||||
+	$(LINK) -shared -o libunrar.so.3 $(LDFLAGS) $(OBJECTS) $(LIB_OBJ) $(UNRAR_OBJ)
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+liba:	WHAT=RARDLL
 | 
					 | 
				
			||||||
+liba:	$(OBJECTS) $(LIB_OBJ) $(UNRAR_OBJ)
 | 
					 | 
				
			||||||
+	@rm -f libunrar.a
 | 
					 | 
				
			||||||
+	$(AR) rc libunrar.a $(OBJECTS) $(LIB_OBJ) $(UNRAR_OBJ)
 | 
					 | 
				
			||||||
+	$(RANLIB) libunrar.a
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 install-unrar:
 | 
					 | 
				
			||||||
 			install unrar $(DESTDIR)/bin
 | 
					 | 
				
			||||||
							
								
								
									
										1031
									
								
								libunrar/pathfn.cpp
								
								
								
								
							
							
						
						
									
										1031
									
								
								libunrar/pathfn.cpp
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -1,49 +1,76 @@
 | 
				
			||||||
#ifndef _RAR_PATHFN_
 | 
					#ifndef _RAR_PATHFN_
 | 
				
			||||||
#define _RAR_PATHFN_
 | 
					#define _RAR_PATHFN_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char* PointToName(const char *Path);
 | 
					 | 
				
			||||||
wchar* PointToName(const wchar *Path);
 | 
					wchar* PointToName(const wchar *Path);
 | 
				
			||||||
char* PointToLastChar(const char *Path);
 | 
					wchar* PointToLastChar(const wchar *Path);
 | 
				
			||||||
char* ConvertPath(const char *SrcPath,char *DestPath);
 | 
					wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath,size_t DestSize);
 | 
				
			||||||
wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath);
 | 
					void SetName(wchar *FullName,const wchar *Name,size_t MaxSize);
 | 
				
			||||||
void SetExt(char *Name,const char *NewExt);
 | 
					void SetExt(wchar *Name,const wchar *NewExt,size_t MaxSize);
 | 
				
			||||||
void SetExt(wchar *Name,const wchar *NewExt);
 | 
					void SetSFXExt(wchar *SFXName,size_t MaxSize);
 | 
				
			||||||
void SetSFXExt(char *SFXName);
 | 
					 | 
				
			||||||
void SetSFXExt(wchar *SFXName);
 | 
					 | 
				
			||||||
char *GetExt(const char *Name);
 | 
					 | 
				
			||||||
wchar *GetExt(const wchar *Name);
 | 
					wchar *GetExt(const wchar *Name);
 | 
				
			||||||
bool CmpExt(const char *Name,const char *Ext);
 | 
					bool CmpExt(const wchar *Name,const wchar *Ext);
 | 
				
			||||||
bool IsWildcard(const char *Str,const wchar *StrW=NULL);
 | 
					bool IsWildcard(const wchar *Str);
 | 
				
			||||||
bool IsPathDiv(int Ch);
 | 
					bool IsPathDiv(int Ch);
 | 
				
			||||||
bool IsDriveDiv(int Ch);
 | 
					bool IsDriveDiv(int Ch);
 | 
				
			||||||
int GetPathDisk(const char *Path);
 | 
					bool IsDriveLetter(const wchar *Path);
 | 
				
			||||||
void AddEndSlash(char *Path);
 | 
					int GetPathDisk(const wchar *Path);
 | 
				
			||||||
void AddEndSlash(wchar *Path);
 | 
					void AddEndSlash(wchar *Path,size_t MaxLength);
 | 
				
			||||||
void GetFilePath(const char *FullName,char *Path,int MaxLength);
 | 
					void MakeName(const wchar *Path,const wchar *Name,wchar *Pathname,size_t MaxSize);
 | 
				
			||||||
void GetFilePath(const wchar *FullName,wchar *Path,int MaxLength);
 | 
					void GetFilePath(const wchar *FullName,wchar *Path,size_t MaxLength);
 | 
				
			||||||
void RemoveNameFromPath(char *Path);
 | 
					 | 
				
			||||||
void RemoveNameFromPath(wchar *Path);
 | 
					void RemoveNameFromPath(wchar *Path);
 | 
				
			||||||
void GetAppDataPath(char *Path);
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE)
 | 
				
			||||||
void GetRarDataPath(char *Path);
 | 
					bool GetAppDataPath(wchar *Path,size_t MaxSize,bool Create);
 | 
				
			||||||
bool EnumConfigPaths(char *Path,int Number);
 | 
					void GetRarDataPath(wchar *Path,size_t MaxSize,bool Create);
 | 
				
			||||||
void GetConfigName(const char *Name,char *FullName,bool CheckExist);
 | 
					#endif
 | 
				
			||||||
char* GetVolNumPart(char *ArcName);
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
void NextVolumeName(char *ArcName,wchar *ArcNameW,uint MaxLength,bool OldNumbering);
 | 
					bool EnumConfigPaths(uint Number,wchar *Path,size_t MaxSize,bool Create);
 | 
				
			||||||
bool IsNameUsable(const char *Name);
 | 
					void GetConfigName(const wchar *Name,wchar *FullName,size_t MaxSize,bool CheckExist,bool Create);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					wchar* GetVolNumPart(const wchar *ArcName);
 | 
				
			||||||
 | 
					void NextVolumeName(wchar *ArcName,uint MaxLength,bool OldNumbering);
 | 
				
			||||||
 | 
					bool IsNameUsable(const wchar *Name);
 | 
				
			||||||
void MakeNameUsable(char *Name,bool Extended);
 | 
					void MakeNameUsable(char *Name,bool Extended);
 | 
				
			||||||
char* UnixSlashToDos(char *SrcName,char *DestName=NULL,uint MaxLength=NM);
 | 
					void MakeNameUsable(wchar *Name,bool Extended);
 | 
				
			||||||
char* DosSlashToUnix(char *SrcName,char *DestName=NULL,uint MaxLength=NM);
 | 
					
 | 
				
			||||||
wchar* UnixSlashToDos(wchar *SrcName,wchar *DestName=NULL,uint MaxLength=NM);
 | 
					void UnixSlashToDos(const char *SrcName,char *DestName,size_t MaxLength);
 | 
				
			||||||
bool IsFullPath(const char *Path);
 | 
					void DosSlashToUnix(const char *SrcName,char *DestName,size_t MaxLength);
 | 
				
			||||||
 | 
					void UnixSlashToDos(const wchar *SrcName,wchar *DestName,size_t MaxLength);
 | 
				
			||||||
 | 
					void DosSlashToUnix(const wchar *SrcName,wchar *DestName,size_t MaxLength);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void SlashToNative(const char *SrcName,char *DestName,size_t MaxLength)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  UnixSlashToDos(SrcName,DestName,MaxLength);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  DosSlashToUnix(SrcName,DestName,MaxLength);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void SlashToNative(const wchar *SrcName,wchar *DestName,size_t MaxLength)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					  UnixSlashToDos(SrcName,DestName,MaxLength);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  DosSlashToUnix(SrcName,DestName,MaxLength);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ConvertNameToFull(const wchar *Src,wchar *Dest,size_t MaxSize);
 | 
				
			||||||
bool IsFullPath(const wchar *Path);
 | 
					bool IsFullPath(const wchar *Path);
 | 
				
			||||||
bool IsDiskLetter(const char *Path);
 | 
					bool IsFullRootPath(const wchar *Path);
 | 
				
			||||||
bool IsDiskLetter(const wchar *Path);
 | 
					void GetPathRoot(const wchar *Path,wchar *Root,size_t MaxSize);
 | 
				
			||||||
void GetPathRoot(const char *Path,char *Root);
 | 
					int ParseVersionFileName(wchar *Name,bool Truncate);
 | 
				
			||||||
int ParseVersionFileName(char *Name,wchar *NameW,bool Truncate);
 | 
					wchar* VolNameToFirstName(const wchar *VolName,wchar *FirstName,size_t MaxSize,bool NewNumbering);
 | 
				
			||||||
char* VolNameToFirstName(const char *VolName,char *FirstName,bool NewNumbering);
 | 
					wchar* GetWideName(const char *Name,const wchar *NameW,wchar *DestW,size_t DestSize);
 | 
				
			||||||
wchar* GetWideName(const char *Name,const wchar *NameW,wchar *DestW);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					void GenerateArchiveName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,bool Archiving);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline char* GetOutputName(const char *Name) {return((char *)Name);};
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					bool GetWinLongPath(const wchar *Src,wchar *Dest,size_t MaxSize);
 | 
				
			||||||
 | 
					void ConvertToPrecomposed(wchar *Name,size_t NameSize);
 | 
				
			||||||
 | 
					void MakeNameCompatible(wchar *Name);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,300 @@
 | 
				
			||||||
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QuickOpen::QuickOpen()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  Buf=NULL;
 | 
				
			||||||
 | 
					  Init(NULL,false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QuickOpen::~QuickOpen()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  Close();
 | 
				
			||||||
 | 
					  delete[] Buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void QuickOpen::Init(Archive *Arc,bool WriteMode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (Arc!=NULL) // Unless called from constructor.
 | 
				
			||||||
 | 
					    Close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  QuickOpen::Arc=Arc;
 | 
				
			||||||
 | 
					  QuickOpen::WriteMode=WriteMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ListStart=NULL;
 | 
				
			||||||
 | 
					  ListEnd=NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Buf==NULL)
 | 
				
			||||||
 | 
					    Buf=new byte[MaxBufSize];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CurBufSize=0; // Current size of buffered data in write mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Loaded=false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void QuickOpen::Close()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  QuickOpenItem *Item=ListStart;
 | 
				
			||||||
 | 
					  while (Item!=NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    QuickOpenItem *Next=Item->Next;
 | 
				
			||||||
 | 
					    delete[] Item->Header;
 | 
				
			||||||
 | 
					    delete Item;
 | 
				
			||||||
 | 
					    Item=Next;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void QuickOpen::Load(uint64 BlockPos)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!Loaded)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // If loading for the first time, perform additional intialization.
 | 
				
			||||||
 | 
					    SeekPos=Arc->Tell();
 | 
				
			||||||
 | 
					    UnsyncSeekPos=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int64 SavePos=SeekPos;
 | 
				
			||||||
 | 
					    Arc->Seek(BlockPos,SEEK_SET);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // If BlockPos points to original main header, we'll have the infinite
 | 
				
			||||||
 | 
					    // recursion, because ReadHeader() for main header will attempt to load
 | 
				
			||||||
 | 
					    // QOpen and call QuickOpen::Load again. If BlockPos points to long chain
 | 
				
			||||||
 | 
					    // of other main headers, we'll have multiple recursive calls of this
 | 
				
			||||||
 | 
					    // function wasting resources. So we prohibit QOpen temporarily to
 | 
				
			||||||
 | 
					    // prevent this. ReadHeader() calls QOpen.Init and sets MainHead Locator
 | 
				
			||||||
 | 
					    // and QOpenOffset fields, so we cannot use them to prohibit QOpen.
 | 
				
			||||||
 | 
					    Arc->SetProhibitQOpen(true);
 | 
				
			||||||
 | 
					    size_t ReadSize=Arc->ReadHeader();
 | 
				
			||||||
 | 
					    Arc->SetProhibitQOpen(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ReadSize==0 || Arc->GetHeaderType()!=HEAD_SERVICE ||
 | 
				
			||||||
 | 
					        !Arc->SubHead.CmpName(SUBHEAD_TYPE_QOPEN))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      Arc->Seek(SavePos,SEEK_SET);
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QOHeaderPos=Arc->CurBlockPos;
 | 
				
			||||||
 | 
					    RawDataStart=Arc->Tell();
 | 
				
			||||||
 | 
					    RawDataSize=Arc->SubHead.UnpSize;
 | 
				
			||||||
 | 
					    Arc->Seek(SavePos,SEEK_SET);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Loaded=true; // Set only after all file processing calls like Tell, Seek, ReadHeader.
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Arc->SubHead.Encrypted)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    RAROptions *Cmd=Arc->GetRAROptions();
 | 
				
			||||||
 | 
					#ifndef RAR_NOCRYPT
 | 
				
			||||||
 | 
					    if (Cmd->Password.IsSet())
 | 
				
			||||||
 | 
					      Crypt.SetCryptKeys(false,CRYPT_RAR50,&Cmd->Password,Arc->SubHead.Salt,
 | 
				
			||||||
 | 
					                         Arc->SubHead.InitV,Arc->SubHead.Lg2Count,
 | 
				
			||||||
 | 
					                         Arc->SubHead.HashKey,Arc->SubHead.PswCheck);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      Loaded=false;
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RawDataPos=0;
 | 
				
			||||||
 | 
					  ReadBufSize=0;
 | 
				
			||||||
 | 
					  ReadBufPos=0;
 | 
				
			||||||
 | 
					  LastReadHeader.Reset();
 | 
				
			||||||
 | 
					  LastReadHeaderPos=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ReadBuffer();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool QuickOpen::Read(void *Data,size_t Size,size_t &Result)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!Loaded)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  // Find next suitable cached block.
 | 
				
			||||||
 | 
					  while (LastReadHeaderPos+LastReadHeader.Size()<=SeekPos)
 | 
				
			||||||
 | 
					    if (!ReadNext())
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  if (!Loaded)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // If something wrong happened, let's set the correct file pointer
 | 
				
			||||||
 | 
					    // and stop further quick open processing.
 | 
				
			||||||
 | 
					    if (UnsyncSeekPos)
 | 
				
			||||||
 | 
					      Arc->File::Seek(SeekPos,SEEK_SET);
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (SeekPos>=LastReadHeaderPos && SeekPos+Size<=LastReadHeaderPos+LastReadHeader.Size())
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    memcpy(Data,LastReadHeader+size_t(SeekPos-LastReadHeaderPos),Size);
 | 
				
			||||||
 | 
					    Result=Size;
 | 
				
			||||||
 | 
					    SeekPos+=Size;
 | 
				
			||||||
 | 
					    UnsyncSeekPos=true;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (UnsyncSeekPos)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      Arc->File::Seek(SeekPos,SEEK_SET);
 | 
				
			||||||
 | 
					      UnsyncSeekPos=false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    int ReadSize=Arc->File::Read(Data,Size);
 | 
				
			||||||
 | 
					    if (ReadSize<0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      Loaded=false;
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Result=ReadSize;
 | 
				
			||||||
 | 
					    SeekPos+=ReadSize;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool QuickOpen::Seek(int64 Offset,int Method)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!Loaded)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Normally we process an archive sequentially from beginning to end,
 | 
				
			||||||
 | 
					  // so we read quick open data sequentially. But some operations like
 | 
				
			||||||
 | 
					  // archive updating involve several passes. So if we detect that file
 | 
				
			||||||
 | 
					  // pointer is moved back, we reload quick open data from beginning.
 | 
				
			||||||
 | 
					  if (Method==SEEK_SET && (uint64)Offset<SeekPos && (uint64)Offset<LastReadHeaderPos)
 | 
				
			||||||
 | 
					    Load(QOHeaderPos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Method==SEEK_SET)
 | 
				
			||||||
 | 
					    SeekPos=Offset;
 | 
				
			||||||
 | 
					  if (Method==SEEK_CUR)
 | 
				
			||||||
 | 
					    SeekPos+=Offset;
 | 
				
			||||||
 | 
					  UnsyncSeekPos=true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Method==SEEK_END)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Arc->File::Seek(Offset,SEEK_END);
 | 
				
			||||||
 | 
					    SeekPos=Arc->File::Tell();
 | 
				
			||||||
 | 
					    UnsyncSeekPos=false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool QuickOpen::Tell(int64 *Pos)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!Loaded)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  *Pos=SeekPos;
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint QuickOpen::ReadBuffer()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int64 SavePos=Arc->Tell();
 | 
				
			||||||
 | 
					  Arc->File::Seek(RawDataStart+RawDataPos,SEEK_SET);
 | 
				
			||||||
 | 
					  size_t SizeToRead=(size_t)Min(RawDataSize-RawDataPos,MaxBufSize-ReadBufSize);
 | 
				
			||||||
 | 
					  if (Arc->SubHead.Encrypted)
 | 
				
			||||||
 | 
					    SizeToRead &= ~CRYPT_BLOCK_MASK;
 | 
				
			||||||
 | 
					  int ReadSize=0;
 | 
				
			||||||
 | 
					  if (SizeToRead!=0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    ReadSize=Arc->File::Read(Buf+ReadBufSize,SizeToRead);
 | 
				
			||||||
 | 
					    if (ReadSize<=0)
 | 
				
			||||||
 | 
					      ReadSize=0;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					#ifndef RAR_NOCRYPT
 | 
				
			||||||
 | 
					      if (Arc->SubHead.Encrypted)
 | 
				
			||||||
 | 
					        Crypt.DecryptBlock(Buf+ReadBufSize,ReadSize & ~CRYPT_BLOCK_MASK);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      RawDataPos+=ReadSize;
 | 
				
			||||||
 | 
					      ReadBufSize+=ReadSize;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  Arc->Seek(SavePos,SEEK_SET);
 | 
				
			||||||
 | 
					  return ReadSize;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Fill RawRead object from buffer.
 | 
				
			||||||
 | 
					bool QuickOpen::ReadRaw(RawRead &Raw)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (MaxBufSize-ReadBufPos<0x100) // We are close to end of buffer.
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Ensure that we have enough data to read CRC and header size.
 | 
				
			||||||
 | 
					    size_t DataLeft=ReadBufSize-ReadBufPos;
 | 
				
			||||||
 | 
					    memcpy(Buf,Buf+ReadBufPos,DataLeft);
 | 
				
			||||||
 | 
					    ReadBufPos=0;
 | 
				
			||||||
 | 
					    ReadBufSize=DataLeft;
 | 
				
			||||||
 | 
					    ReadBuffer();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const size_t FirstReadSize=7;
 | 
				
			||||||
 | 
					  if (ReadBufPos+FirstReadSize>ReadBufSize)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  Raw.Read(Buf+ReadBufPos,FirstReadSize);
 | 
				
			||||||
 | 
					  ReadBufPos+=FirstReadSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint SavedCRC=Raw.Get4();
 | 
				
			||||||
 | 
					  uint SizeBytes=Raw.GetVSize(4);
 | 
				
			||||||
 | 
					  uint64 BlockSize=Raw.GetV();
 | 
				
			||||||
 | 
					  int SizeToRead=int(BlockSize);
 | 
				
			||||||
 | 
					  SizeToRead-=FirstReadSize-SizeBytes-4; // Adjust overread size bytes if any.
 | 
				
			||||||
 | 
					  if (SizeToRead<0 || SizeBytes==0 || BlockSize==0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Loaded=false; // Invalid data.
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // If rest of block data crosses Buf boundary, read it in loop.
 | 
				
			||||||
 | 
					  while (SizeToRead>0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    size_t DataLeft=ReadBufSize-ReadBufPos;
 | 
				
			||||||
 | 
					    size_t CurSizeToRead=Min(DataLeft,(size_t)SizeToRead);
 | 
				
			||||||
 | 
					    Raw.Read(Buf+ReadBufPos,CurSizeToRead);
 | 
				
			||||||
 | 
					    ReadBufPos+=CurSizeToRead;
 | 
				
			||||||
 | 
					    SizeToRead-=int(CurSizeToRead);
 | 
				
			||||||
 | 
					    if (SizeToRead>0) // We read the entire buffer and still need more data.
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ReadBufPos=0;
 | 
				
			||||||
 | 
					      ReadBufSize=0;
 | 
				
			||||||
 | 
					      if (ReadBuffer()==0)
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return SavedCRC==Raw.GetCRC50();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Read next cached header.
 | 
				
			||||||
 | 
					bool QuickOpen::ReadNext()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  RawRead Raw(NULL);
 | 
				
			||||||
 | 
					  if (!ReadRaw(Raw)) // Read internal quick open header preceding stored block.
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  uint Flags=(uint)Raw.GetV();
 | 
				
			||||||
 | 
					  uint64 Offset=Raw.GetV();
 | 
				
			||||||
 | 
					  size_t HeaderSize=(size_t)Raw.GetV();
 | 
				
			||||||
 | 
					  if (HeaderSize>MAX_HEADER_SIZE_RAR5)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  LastReadHeader.Alloc(HeaderSize);
 | 
				
			||||||
 | 
					  Raw.GetB(&LastReadHeader[0],HeaderSize);
 | 
				
			||||||
 | 
					  // Calculate the absolute position as offset from quick open service header.
 | 
				
			||||||
 | 
					  LastReadHeaderPos=QOHeaderPos-Offset;
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					#ifndef _RAR_QOPEN_
 | 
				
			||||||
 | 
					#define _RAR_QOPEN_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct QuickOpenItem
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  byte *Header;
 | 
				
			||||||
 | 
					  size_t HeaderSize;
 | 
				
			||||||
 | 
					  uint64 ArcPos;
 | 
				
			||||||
 | 
					  QuickOpenItem *Next;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Archive;
 | 
				
			||||||
 | 
					class RawRead;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class QuickOpen
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  private:
 | 
				
			||||||
 | 
					    void Close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint ReadBuffer();
 | 
				
			||||||
 | 
					    bool ReadRaw(RawRead &Raw);
 | 
				
			||||||
 | 
					    bool ReadNext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Archive *Arc;
 | 
				
			||||||
 | 
					    bool WriteMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QuickOpenItem *ListStart;
 | 
				
			||||||
 | 
					    QuickOpenItem *ListEnd;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    byte *Buf; // Read quick open data here.
 | 
				
			||||||
 | 
					    static const size_t MaxBufSize=0x10000; // Buf size, must be multiple of CRYPT_BLOCK_SIZE.
 | 
				
			||||||
 | 
					    size_t CurBufSize; // Current size of buffered data in write mode.
 | 
				
			||||||
 | 
					#ifndef RAR_NOCRYPT // For shell extension.
 | 
				
			||||||
 | 
					    CryptData Crypt;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool Loaded;
 | 
				
			||||||
 | 
					    uint64 QOHeaderPos;  // Main QO header position.
 | 
				
			||||||
 | 
					    uint64 RawDataStart; // Start of QO data, just after the main header.
 | 
				
			||||||
 | 
					    uint64 RawDataSize;  // Size of entire QO data.
 | 
				
			||||||
 | 
					    uint64 RawDataPos;   // Current read position in QO data.
 | 
				
			||||||
 | 
					    size_t ReadBufSize;  // Size of Buf data currently read from QO.
 | 
				
			||||||
 | 
					    size_t ReadBufPos;   // Current read position in Buf data.
 | 
				
			||||||
 | 
					    Array<byte> LastReadHeader;
 | 
				
			||||||
 | 
					    uint64 LastReadHeaderPos;
 | 
				
			||||||
 | 
					    uint64 SeekPos;
 | 
				
			||||||
 | 
					    bool UnsyncSeekPos;  // QOpen SeekPos does not match an actual file pointer.
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
					    QuickOpen();
 | 
				
			||||||
 | 
					    ~QuickOpen();
 | 
				
			||||||
 | 
					    void Init(Archive *Arc,bool WriteMode);
 | 
				
			||||||
 | 
					    void Load(uint64 BlockPos);
 | 
				
			||||||
 | 
					    void Unload() { Loaded=false; }
 | 
				
			||||||
 | 
					    bool Read(void *Data,size_t Size,size_t &Result);
 | 
				
			||||||
 | 
					    bool Seek(int64 Offset,int Method);
 | 
				
			||||||
 | 
					    bool Tell(int64 *Pos);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										131
									
								
								libunrar/rar.cpp
								
								
								
								
							
							
						
						
									
										131
									
								
								libunrar/rar.cpp
								
								
								
								
							| 
						 | 
					@ -1,135 +1,106 @@
 | 
				
			||||||
#include "rar.hpp"
 | 
					#include "rar.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(GUI) && !defined(RARDLL)
 | 
					#if !defined(RARDLL)
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _UNIX
 | 
					#ifdef _UNIX
 | 
				
			||||||
  setlocale(LC_ALL,"");
 | 
					  setlocale(LC_ALL,"");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_EMX) && !defined(_DJGPP)
 | 
					  InitConsole();
 | 
				
			||||||
  uni_init(0);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(_SFX_RTL_) && !defined(_WIN_32)
 | 
					 | 
				
			||||||
  setbuf(stdout,NULL);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(SFX_MODULE) && defined(_EMX)
 | 
					 | 
				
			||||||
  EnumConfigPaths(argv[0],-1);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ErrHandler.SetSignalHandlers(true);
 | 
					  ErrHandler.SetSignalHandlers(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  RARInitData();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef SFX_MODULE
 | 
					#ifdef SFX_MODULE
 | 
				
			||||||
  char ModuleName[NM];
 | 
					  wchar ModuleName[NM];
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  GetModuleFileName(NULL,ModuleName,sizeof(ModuleName));
 | 
					  GetModuleFileName(NULL,ModuleName,ASIZE(ModuleName));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  strcpy(ModuleName,argv[0]);
 | 
					  CharToWide(argv[0],ModuleName,ASIZE(ModuleName));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN_32
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
  SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT|SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
 | 
					  SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT|SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(SHELL_EXT)
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE)
 | 
				
			||||||
  bool ShutdownOnClose;
 | 
					  // Must be initialized, normal initialization can be skipped in case of
 | 
				
			||||||
 | 
					  // exception.
 | 
				
			||||||
 | 
					  POWER_MODE ShutdownOnClose=POWERMODE_KEEP;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ALLOW_EXCEPTIONS
 | 
					 | 
				
			||||||
  try 
 | 
					  try 
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
    CommandData Cmd;
 | 
					    CommandData *Cmd=new CommandData;
 | 
				
			||||||
#ifdef SFX_MODULE
 | 
					#ifdef SFX_MODULE
 | 
				
			||||||
    strcpy(Cmd.Command,"X");
 | 
					    wcsncpyz(Cmd->Command,L"X",ASIZE(Cmd->Command));
 | 
				
			||||||
    char *Switch=NULL;
 | 
					    char *Switch=argc>1 ? argv[1]:NULL;
 | 
				
			||||||
#ifdef _SFX_RTL_
 | 
					    if (Switch!=NULL && Cmd->IsSwitch(Switch[0]))
 | 
				
			||||||
    char *CmdLine=GetCommandLine();
 | 
					 | 
				
			||||||
    if (CmdLine!=NULL && *CmdLine=='\"')
 | 
					 | 
				
			||||||
      CmdLine=strchr(CmdLine+1,'\"');
 | 
					 | 
				
			||||||
    if (CmdLine!=NULL && (CmdLine=strpbrk(CmdLine," /"))!=NULL)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      while (IsSpace(*CmdLine))
 | 
					 | 
				
			||||||
        CmdLine++;
 | 
					 | 
				
			||||||
      Switch=CmdLine;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    Switch=argc>1 ? argv[1]:NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    if (Switch!=NULL && Cmd.IsSwitch(Switch[0]))
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      int UpperCmd=etoupper(Switch[1]);
 | 
					      int UpperCmd=etoupper(Switch[1]);
 | 
				
			||||||
      switch(UpperCmd)
 | 
					      switch(UpperCmd)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        case 'T':
 | 
					        case 'T':
 | 
				
			||||||
        case 'V':
 | 
					        case 'V':
 | 
				
			||||||
          Cmd.Command[0]=UpperCmd;
 | 
					          Cmd->Command[0]=UpperCmd;
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case '?':
 | 
					        case '?':
 | 
				
			||||||
          Cmd.OutHelp();
 | 
					          Cmd->OutHelp(RARX_SUCCESS);
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Cmd.AddArcName(ModuleName,NULL);
 | 
					    Cmd->AddArcName(ModuleName);
 | 
				
			||||||
#else
 | 
					    Cmd->ParseDone();
 | 
				
			||||||
    if (Cmd.IsConfigEnabled(argc,argv))
 | 
					    Cmd->AbsoluteLinks=true; // If users runs SFX, he trusts an archive source.
 | 
				
			||||||
 | 
					#else // !SFX_MODULE
 | 
				
			||||||
 | 
					    Cmd->ParseCommandLine(true,argc,argv);
 | 
				
			||||||
 | 
					    if (!Cmd->ConfigDisabled)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      Cmd.ReadConfig(argc,argv);
 | 
					      Cmd->ReadConfig();
 | 
				
			||||||
      Cmd.ParseEnvVar();
 | 
					      Cmd->ParseEnvVar();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    for (int I=1;I<argc;I++)
 | 
					    Cmd->ParseCommandLine(false,argc,argv);
 | 
				
			||||||
      Cmd.ParseArg(argv[I],NULL);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    Cmd.ParseDone();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(SHELL_EXT)
 | 
					 | 
				
			||||||
    ShutdownOnClose=Cmd.Shutdown;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    InitConsoleOptions(Cmd.MsgStream,Cmd.Sound);
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE)
 | 
				
			||||||
    InitLogOptions(Cmd.LogName);
 | 
					    ShutdownOnClose=Cmd->Shutdown;
 | 
				
			||||||
    ErrHandler.SetSilent(Cmd.AllYes || Cmd.MsgStream==MSG_NULL);
 | 
					    if (ShutdownOnClose)
 | 
				
			||||||
    ErrHandler.SetShutdown(Cmd.Shutdown);
 | 
					      ShutdownCheckAnother(true);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Cmd.OutTitle();
 | 
					    uiInit(Cmd->Sound);
 | 
				
			||||||
    Cmd.ProcessCommand();
 | 
					    InitLogOptions(Cmd->LogName,Cmd->ErrlogCharset);
 | 
				
			||||||
 | 
					    ErrHandler.SetSilent(Cmd->AllYes || Cmd->MsgStream==MSG_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Cmd->OutTitle();
 | 
				
			||||||
 | 
					    Cmd->ProcessCommand();
 | 
				
			||||||
 | 
					    delete Cmd;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#ifdef ALLOW_EXCEPTIONS
 | 
					  catch (RAR_EXIT ErrCode)
 | 
				
			||||||
  catch (int ErrCode)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    ErrHandler.SetErrorCode(ErrCode);
 | 
					    ErrHandler.SetErrorCode(ErrCode);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#ifdef ENABLE_BAD_ALLOC
 | 
					  catch (std::bad_alloc&)
 | 
				
			||||||
  catch (bad_alloc)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    ErrHandler.SetErrorCode(MEMORY_ERROR);
 | 
					    ErrHandler.MemoryErrorMsg();
 | 
				
			||||||
 | 
					    ErrHandler.SetErrorCode(RARX_MEMORY);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  catch (...)
 | 
					  catch (...)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    ErrHandler.SetErrorCode(FATAL_ERROR);
 | 
					    ErrHandler.SetErrorCode(RARX_FATAL);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN_ALL) && !defined(SFX_MODULE)
 | 
				
			||||||
 | 
					  if (ShutdownOnClose!=POWERMODE_KEEP && ErrHandler.IsShutdownEnabled() &&
 | 
				
			||||||
 | 
					      !ShutdownCheckAnother(false))
 | 
				
			||||||
 | 
					    Shutdown(ShutdownOnClose);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  File::RemoveCreated();
 | 
					  ErrHandler.MainExit=true;
 | 
				
			||||||
#if defined(SFX_MODULE) && defined(_DJGPP)
 | 
					  return ErrHandler.GetErrorCode();
 | 
				
			||||||
  _chmod(ModuleName,1,0x20);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if defined(_EMX) && !defined(_DJGPP)
 | 
					 | 
				
			||||||
  uni_done();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(SHELL_EXT)
 | 
					 | 
				
			||||||
  if (ShutdownOnClose)
 | 
					 | 
				
			||||||
    Shutdown();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  return(ErrHandler.GetErrorCode());
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,61 +2,70 @@
 | 
				
			||||||
#define _RAR_RARCOMMON_
 | 
					#define _RAR_RARCOMMON_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "raros.hpp"
 | 
					#include "raros.hpp"
 | 
				
			||||||
 | 
					#include "rartypes.hpp"
 | 
				
			||||||
#include "os.hpp"
 | 
					#include "os.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef RARDLL
 | 
					#ifdef RARDLL
 | 
				
			||||||
#include "dll.hpp"
 | 
					#include "dll.hpp"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _WIN_CE
 | 
					 | 
				
			||||||
#include "version.hpp"
 | 
					#include "version.hpp"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#include "rartypes.hpp"
 | 
					 | 
				
			||||||
#include "rardefs.hpp"
 | 
					#include "rardefs.hpp"
 | 
				
			||||||
#include "rarlang.hpp"
 | 
					#include "rarlang.hpp"
 | 
				
			||||||
#include "unicode.hpp"
 | 
					#include "unicode.hpp"
 | 
				
			||||||
#include "errhnd.hpp"
 | 
					#include "errhnd.hpp"
 | 
				
			||||||
 | 
					#include "secpassword.hpp"
 | 
				
			||||||
#include "array.hpp"
 | 
					#include "array.hpp"
 | 
				
			||||||
#include "timefn.hpp"
 | 
					#include "timefn.hpp"
 | 
				
			||||||
 | 
					#include "sha1.hpp"
 | 
				
			||||||
 | 
					#include "sha256.hpp"
 | 
				
			||||||
 | 
					#include "blake2s.hpp"
 | 
				
			||||||
 | 
					#include "hash.hpp"
 | 
				
			||||||
#include "options.hpp"
 | 
					#include "options.hpp"
 | 
				
			||||||
 | 
					#include "rijndael.hpp"
 | 
				
			||||||
 | 
					#include "crypt.hpp"
 | 
				
			||||||
 | 
					#include "headers5.hpp"
 | 
				
			||||||
#include "headers.hpp"
 | 
					#include "headers.hpp"
 | 
				
			||||||
#include "pathfn.hpp"
 | 
					#include "pathfn.hpp"
 | 
				
			||||||
#include "strfn.hpp"
 | 
					#include "strfn.hpp"
 | 
				
			||||||
#include "strlist.hpp"
 | 
					#include "strlist.hpp"
 | 
				
			||||||
 | 
					#ifdef _WIN_ALL
 | 
				
			||||||
 | 
					#include "isnt.hpp"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#include "file.hpp"
 | 
					#include "file.hpp"
 | 
				
			||||||
#include "sha1.hpp"
 | 
					 | 
				
			||||||
#include "crc.hpp"
 | 
					#include "crc.hpp"
 | 
				
			||||||
#include "rijndael.hpp"
 | 
					#include "ui.hpp"
 | 
				
			||||||
#include "crypt.hpp"
 | 
					 | 
				
			||||||
#include "filefn.hpp"
 | 
					#include "filefn.hpp"
 | 
				
			||||||
#include "filestr.hpp"
 | 
					#include "filestr.hpp"
 | 
				
			||||||
#include "find.hpp"
 | 
					#include "find.hpp"
 | 
				
			||||||
#include "scantree.hpp"
 | 
					#include "scantree.hpp"
 | 
				
			||||||
#include "savepos.hpp"
 | 
					 | 
				
			||||||
#include "getbits.hpp"
 | 
					#include "getbits.hpp"
 | 
				
			||||||
#include "rdwrfn.hpp"
 | 
					#include "rdwrfn.hpp"
 | 
				
			||||||
 | 
					#ifdef USE_QOPEN
 | 
				
			||||||
 | 
					#include "qopen.hpp"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#include "archive.hpp"
 | 
					#include "archive.hpp"
 | 
				
			||||||
#include "match.hpp"
 | 
					#include "match.hpp"
 | 
				
			||||||
#include "cmddata.hpp"
 | 
					#include "cmddata.hpp"
 | 
				
			||||||
#include "filcreat.hpp"
 | 
					#include "filcreat.hpp"
 | 
				
			||||||
#include "consio.hpp"
 | 
					#include "consio.hpp"
 | 
				
			||||||
#include "system.hpp"
 | 
					#include "system.hpp"
 | 
				
			||||||
#include "isnt.hpp"
 | 
					 | 
				
			||||||
#include "log.hpp"
 | 
					#include "log.hpp"
 | 
				
			||||||
 | 
					#include "rawint.hpp"
 | 
				
			||||||
#include "rawread.hpp"
 | 
					#include "rawread.hpp"
 | 
				
			||||||
#include "encname.hpp"
 | 
					#include "encname.hpp"
 | 
				
			||||||
#include "resource.hpp"
 | 
					#include "resource.hpp"
 | 
				
			||||||
#include "compress.hpp"
 | 
					#include "compress.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "rarvm.hpp"
 | 
					#include "rarvm.hpp"
 | 
				
			||||||
#include "model.hpp"
 | 
					#include "model.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "threadpool.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "unpack.hpp"
 | 
					#include "unpack.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "extinfo.hpp"
 | 
					#include "extinfo.hpp"
 | 
				
			||||||
#include "extract.hpp"
 | 
					#include "extract.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,12 +75,22 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rs.hpp"
 | 
					#include "rs.hpp"
 | 
				
			||||||
 | 
					#include "rs16.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "recvol.hpp"
 | 
					#include "recvol.hpp"
 | 
				
			||||||
#include "volume.hpp"
 | 
					#include "volume.hpp"
 | 
				
			||||||
#include "smallfn.hpp"
 | 
					#include "smallfn.hpp"
 | 
				
			||||||
#include "ulinks.hpp"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "global.hpp"
 | 
					#include "global.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					#include "benchmark.hpp"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,21 +4,28 @@
 | 
				
			||||||
#define  Min(x,y) (((x)<(y)) ? (x):(y))
 | 
					#define  Min(x,y) (((x)<(y)) ? (x):(y))
 | 
				
			||||||
#define  Max(x,y) (((x)>(y)) ? (x):(y))
 | 
					#define  Max(x,y) (((x)>(y)) ? (x):(y))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Universal replacement of abs function.
 | 
				
			||||||
 | 
					#define  Abs(x) (((x)<0) ? -(x):(x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  ASIZE(x) (sizeof(x)/sizeof(x[0]))
 | 
					#define  ASIZE(x) (sizeof(x)/sizeof(x[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MAXPASSWORD is expected to be multiple of CRYPTPROTECTMEMORY_BLOCK_SIZE (16)
 | 
				
			||||||
 | 
					// for CryptProtectMemory in SecPassword.
 | 
				
			||||||
#define  MAXPASSWORD       128
 | 
					#define  MAXPASSWORD       128
 | 
				
			||||||
#define  MAXSFXSIZE        0x80000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  DefSFXName        "default.sfx"
 | 
					#define  MAXSFXSIZE        0x200000
 | 
				
			||||||
#define  DefSortListName   "rarfiles.lst"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef FA_RDONLY
 | 
					#define  MAXCMTSIZE        0x40000
 | 
				
			||||||
  #define FA_RDONLY   0x01
 | 
					
 | 
				
			||||||
  #define FA_HIDDEN   0x02
 | 
					#define  DefSFXName        L"default.sfx"
 | 
				
			||||||
  #define FA_SYSTEM   0x04
 | 
					#define  DefSortListName   L"rarfiles.lst"
 | 
				
			||||||
  #define FA_LABEL    0x08
 | 
					
 | 
				
			||||||
  #define FA_DIREC    0x10
 | 
					
 | 
				
			||||||
  #define FA_ARCH     0x20
 | 
					#ifndef SFX_MODULE
 | 
				
			||||||
 | 
					#define USE_QOPEN
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Produce the value, which is equal or larger than 'v' and aligned to 'a'.
 | 
				
			||||||
 | 
					#define ALIGN_VALUE(v,a) (size_t(v) + ( (~size_t(v) + 1) & (a - 1) ) )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue