Bah did last commit wrong. Only added the password view.

Added support for handling archives with passwords.
This commit is contained in:
Robert McGovern 2009-11-15 18:50:12 +01:00
parent 9452ac9c87
commit e9ad5c518c
5 changed files with 872 additions and 131 deletions

View File

@ -12,7 +12,8 @@
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 */; };
D488BDB710B0160300B3451C /* OverwriteFilesDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = D488BDB610B0160300B3451C /* OverwriteFilesDialog.xib */; }; D488BDB710B0160300B3451C /* PasswordDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = D488BDB610B0160300B3451C /* PasswordDialog.xib */; };
D488BE5510B05F3800B3451C /* PasswordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D488BE5410B05F3800B3451C /* PasswordView.xib */; };
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 */; };
D4A96E2110545E9A0091ECB4 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4A96E2010545E9A0091ECB4 /* Carbon.framework */; }; D4A96E2110545E9A0091ECB4 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4A96E2010545E9A0091ECB4 /* Carbon.framework */; };
@ -55,7 +56,8 @@
8D1107310486CEB800E47090 /* QuietUnrar-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "QuietUnrar-Info.plist"; sourceTree = "<group>"; }; 8D1107310486CEB800E47090 /* QuietUnrar-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "QuietUnrar-Info.plist"; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* QuietUnrar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QuietUnrar.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8D1107320486CEB800E47090 /* QuietUnrar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QuietUnrar.app; sourceTree = BUILT_PRODUCTS_DIR; };
D488BC6710AF437B00B3451C /* libunrar.so */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libunrar.so; path = libunrar/libunrar.so; sourceTree = "<group>"; }; D488BC6710AF437B00B3451C /* libunrar.so */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libunrar.so; path = libunrar/libunrar.so; sourceTree = "<group>"; };
D488BDB610B0160300B3451C /* OverwriteFilesDialog.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = OverwriteFilesDialog.xib; sourceTree = "<group>"; }; D488BDB610B0160300B3451C /* PasswordDialog.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PasswordDialog.xib; sourceTree = "<group>"; };
D488BE5410B05F3800B3451C /* PasswordView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PasswordView.xib; sourceTree = "<group>"; };
D4A495741054177300BE38AE /* arccmt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arccmt.cpp; path = libunrar/arccmt.cpp; sourceTree = "<group>"; }; D4A495741054177300BE38AE /* arccmt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arccmt.cpp; path = libunrar/arccmt.cpp; sourceTree = "<group>"; };
D4A495751054177300BE38AE /* archive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = archive.cpp; path = libunrar/archive.cpp; sourceTree = "<group>"; }; D4A495751054177300BE38AE /* archive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = archive.cpp; path = libunrar/archive.cpp; sourceTree = "<group>"; };
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>"; };
@ -248,10 +250,11 @@
29B97317FDCFA39411CA2CEA /* Resources */ = { 29B97317FDCFA39411CA2CEA /* Resources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D488BE5410B05F3800B3451C /* PasswordView.xib */,
8D1107310486CEB800E47090 /* QuietUnrar-Info.plist */, 8D1107310486CEB800E47090 /* QuietUnrar-Info.plist */,
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
1DDD58140DA1D0A300B32029 /* MainMenu.xib */, 1DDD58140DA1D0A300B32029 /* MainMenu.xib */,
D488BDB610B0160300B3451C /* OverwriteFilesDialog.xib */, D488BDB610B0160300B3451C /* PasswordDialog.xib */,
); );
name = Resources; name = Resources;
sourceTree = "<group>"; sourceTree = "<group>";
@ -453,7 +456,8 @@
files = ( files = (
D4A49692105435C100BE38AE /* MainMenu.xib in Resources */, D4A49692105435C100BE38AE /* MainMenu.xib in Resources */,
D4A49691105435BE00BE38AE /* InfoPlist.strings in Resources */, D4A49691105435BE00BE38AE /* InfoPlist.strings in Resources */,
D488BDB710B0160300B3451C /* OverwriteFilesDialog.xib in Resources */, D488BDB710B0160300B3451C /* PasswordDialog.xib in Resources */,
D488BE5510B05F3800B3451C /* PasswordView.xib in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@ -264,6 +264,7 @@
<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key> <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
<array> <array>
<string>29B97314FDCFA39411CA2CEA</string> <string>29B97314FDCFA39411CA2CEA</string>
<string>080E96DDFE201D6D7F000001</string>
<string>29B97317FDCFA39411CA2CEA</string> <string>29B97317FDCFA39411CA2CEA</string>
<string>1C37FBAC04509CD000000102</string> <string>1C37FBAC04509CD000000102</string>
<string>1C37FAAC04509CD000000102</string> <string>1C37FAAC04509CD000000102</string>
@ -272,6 +273,7 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key> <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array> <array>
<array> <array>
<integer>3</integer>
<integer>1</integer> <integer>1</integer>
<integer>0</integer> <integer>0</integer>
</array> </array>
@ -326,7 +328,7 @@
<key>_historyCapacity</key> <key>_historyCapacity</key>
<integer>0</integer> <integer>0</integer>
<key>bookmark</key> <key>bookmark</key>
<string>D488BE3510B04D8D00B3451C</string> <string>D488BEE510B0769000B3451C</string>
<key>history</key> <key>history</key>
<array> <array>
<string>D4A4963610541A1C00BE38AE</string> <string>D4A4963610541A1C00BE38AE</string>
@ -344,8 +346,8 @@
<string>D488BD8E10AF7F6900B3451C</string> <string>D488BD8E10AF7F6900B3451C</string>
<string>D488BD8F10AF7F6900B3451C</string> <string>D488BD8F10AF7F6900B3451C</string>
<string>D488BD9010AF7F6900B3451C</string> <string>D488BD9010AF7F6900B3451C</string>
<string>D488BE2510B03F8900B3451C</string> <string>D488BEE010B075CA00B3451C</string>
<string>D488BE2610B03F8900B3451C</string> <string>D488BEE110B075CA00B3451C</string>
</array> </array>
</dict> </dict>
<key>SplitCount</key> <key>SplitCount</key>

File diff suppressed because it is too large Load Diff

View File

@ -25,12 +25,18 @@ enum
@interface QuietUnrarAppDelegate : NSObject <NSApplicationDelegate> { @interface QuietUnrarAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window; NSWindow *window;
NSView *passwordView;
NSSecureTextField * passwordField;
} }
@property (assign) IBOutlet NSWindow *window; @property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSView *passwordView;
@property (assign) IBOutlet NSSecureTextField * passwordField;
- (BOOL) extractRarWith:(NSString *) filename; - (BOOL) extractRarWith:(NSString *) filename;
- (BOOL) shouldFileBeReplaced:(NSString *) filename; - (BOOL) shouldFileBeReplaced:(NSString *) filename;
- (void) alertUserOfMissing:(const char *) volume; - (void) alertUserOfMissing:(const char *) volume;
- (NSString *) requestArchivePassword:(id) archive;
@end @end

View File

@ -16,7 +16,7 @@ int changeVolume(char * volumeName, int mode);
int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM parameterTwo); int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM parameterTwo);
int changeVolume(char * volumeName, int mode) { int changeVolume(char * volumeName, int mode) {
NSLog(@"Volume Name: %s and mode %d", volumeName, mode); //NSLog(@"Volume Name: %s and mode %d", volumeName, mode);
if (mode == RAR_VOL_ASK) if (mode == RAR_VOL_ASK)
{ {
@ -26,18 +26,23 @@ int changeVolume(char * volumeName, int mode) {
} }
int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM parameterTwo) { int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM parameterTwo) {
NSLog(@"Callback Function, args: %d, %D, %D, %D", message, userData, parameterOne, parameterTwo); if (message == UCM_NEEDPASSWORD) {
//NSLog(@"Archive password required");
[(QuietUnrarAppDelegate *) quietUnrar requestArchivePassword: (id) userData];
}
//NSLog(@"Callback Function, args: %d, %D, %D, %D", message, userData, parameterOne, parameterTwo);
} }
@implementation QuietUnrarAppDelegate @implementation QuietUnrarAppDelegate
@synthesize window; @synthesize window, passwordView, passwordField;
- (void) applicationWillFinishLaunching:(NSNotification *)notification { - (void) applicationWillFinishLaunching:(NSNotification *)notification {
KeyMap map; KeyMap map;
GetKeys(map); GetKeys(map);
NSLog(@"Shift or Right Shift: %d", KEYMAP_GET(map, kVKC_Shift) || KEYMAP_GET(map, kVKC_rShift)); //NSLog(@"Shift or Right Shift: %d", KEYMAP_GET(map, kVKC_Shift) || KEYMAP_GET(map, kVKC_rShift));
} }
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
@ -51,7 +56,7 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
//} //}
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename {
NSLog(@"openFile: %@", filename); //NSLog(@"openFile: %@", filename);
[self extractRarWith:filename]; [self extractRarWith:filename];
@ -83,11 +88,11 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
// Open the Archive for extraction, we set the open result to 3 so we can see it has changed // Open the Archive for extraction, we set the open result to 3 so we can see it has changed
struct RAROpenArchiveData arcData = { filenameCString, RAR_OM_EXTRACT, 3, &commentBuffer[0], BUF_LEN, 0, 0}; struct RAROpenArchiveData arcData = { filenameCString, RAR_OM_EXTRACT, 3, &commentBuffer[0], BUF_LEN, 0, 0};
HANDLE archive = RAROpenArchive(&arcData); HANDLE archive = RAROpenArchive(&arcData);
NSLog(@"Opening Archive %s with result %d", filenameCString, arcData.OpenResult); //NSLog(@"Opening Archive %s with result %d", filenameCString, arcData.OpenResult);
// set call backs for if password needed or need to change volume // set call backs for if password needed or need to change volume
RARSetChangeVolProc(archive, &changeVolume); RARSetChangeVolProc(archive, &changeVolume);
//RARSetCallback(archive, &callbackFunction, 0); RARSetCallback(archive, &callbackFunction, (LPARAM)archive);
// //
struct RARHeaderData headerData; struct RARHeaderData headerData;
@ -95,7 +100,7 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
NSString * currentFilename; NSString * currentFilename;
while (RARReadHeader(archive, &headerData) != ERAR_END_ARCHIVE) { while (RARReadHeader(archive, &headerData) != ERAR_END_ARCHIVE) {
NSLog(@"Attempting to extract %s to %@", headerData.FileName, defaultFolderToExtractTo); //NSLog(@"Attempting to extract %s to %@", headerData.FileName, defaultFolderToExtractTo);
int processResult = 0; int processResult = 0;
BOOL extractFile = YES; BOOL extractFile = YES;
@ -115,10 +120,10 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
// NSLog(@"Last filename %@, currentFilename %@, equality %d", lastExtractedFilename, currentFilename, [lastExtractedFilename isEqualToString:currentFilename]); // NSLog(@"Last filename %@, currentFilename %@, equality %d", lastExtractedFilename, currentFilename, [lastExtractedFilename isEqualToString:currentFilename]);
if (extractFile) { if (extractFile) {
NSLog(@"...Extracting"); //NSLog(@"...Extracting");
processResult = RARProcessFile(archive, RAR_EXTRACT, (char *) [defaultFolderToExtractTo cStringUsingEncoding:NSISOLatin1StringEncoding], NULL); processResult = RARProcessFile(archive, RAR_EXTRACT, (char *) [defaultFolderToExtractTo cStringUsingEncoding:NSISOLatin1StringEncoding], NULL);
} else { } else {
NSLog(@"...Skipping as already exists"); //NSLog(@"...Skipping as already exists");
processResult = RARProcessFile(archive, RAR_SKIP, NULL, NULL); processResult = RARProcessFile(archive, RAR_SKIP, NULL, NULL);
// Curious behavior by the lib, you have SKIP a file number of times (4 in my test example) before // Curious behavior by the lib, you have SKIP a file number of times (4 in my test example) before
// it is skipped. However if you extract it is only processed once. // it is skipped. However if you extract it is only processed once.
@ -136,7 +141,7 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
} }
int closeResult = RARCloseArchive(archive); int closeResult = RARCloseArchive(archive);
NSLog(@"Closing Archive %s with result %d", filenameCString, closeResult); //NSLog(@"Closing Archive %s with result %d", filenameCString, closeResult);
return extractionSuccessful; return extractionSuccessful;
} }
@ -162,7 +167,7 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
} }
- (void) alertUserOfMissing:(const char *) volume { - (void) alertUserOfMissing:(const char *) volume {
NSLog(@"Alerting user of missing volume"); //NSLog(@"Alerting user of missing volume");
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
[alert addButtonWithTitle:@"OK"]; [alert addButtonWithTitle:@"OK"];
[alert setMessageText:[NSString stringWithFormat:@"Archive part %s is missing.", volume]]; [alert setMessageText:[NSString stringWithFormat:@"Archive part %s is missing.", volume]];
@ -174,4 +179,26 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM
[alert release]; [alert release];
} }
- (NSString *) requestArchivePassword:(id) archive {
if (!passwordView) {
[NSBundle loadNibNamed:@"PasswordView" owner:self];
}
NSAlert *alert = [[NSAlert alloc] init];
[alert addButtonWithTitle:@"OK"];
[alert addButtonWithTitle:@"Cancel"];
[alert setMessageText:@"Archive Requires a password"];
[alert setInformativeText:@"To extract the contents of this archive a password is required."];
[alert setAccessoryView:passwordView];
[alert setAlertStyle:NSWarningAlertStyle];
if ([alert runModal] == NSAlertFirstButtonReturn) {
NSString * password = [passwordField stringValue];
RARSetPassword((HANDLE)archive, (char *) [password cStringUsingEncoding:NSISOLatin1StringEncoding]);
//NSLog(@"Password is: %@", password);
}
[alert release];
}
@end @end