Browse Source

Exhaust Start

master
GRMrGecko 13 years ago
commit
89c1462a05
  1. 10
      .gitignore
  2. 14
      Classes/MGMAddons.h
  3. 78
      Classes/MGMAddons.m
  4. 74
      Classes/MGMController.h
  5. 720
      Classes/MGMController.m
  6. 23
      Classes/MGMFileManager.h
  7. 86
      Classes/MGMFileManager.m
  8. 26
      Classes/MGMLoginItems.h
  9. 89
      Classes/MGMLoginItems.m
  10. 14
      Classes/main.m
  11. 13
      Classes/prefix.pch
  12. 6
      Contributing.txt
  13. BIN
      Documentation.pages
  14. 1652
      Exhaust.ai
  15. BIN
      Exhaust.icns
  16. BIN
      Exhaust.png
  17. 500
      Exhaust.xcodeproj/project.pbxproj
  18. 7
      Exhaust.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  19. 1
      Frameworks/GeckoReporter.framework/GeckoReporter
  20. 1
      Frameworks/GeckoReporter.framework/Headers
  21. 1
      Frameworks/GeckoReporter.framework/Resources
  22. BIN
      Frameworks/GeckoReporter.framework/Versions/A/GeckoReporter
  23. 12
      Frameworks/GeckoReporter.framework/Versions/A/Headers/GeckoReporter.h
  24. 16
      Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMFeedback.h
  25. 12
      Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMLog.h
  26. 28
      Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMReporter.h
  27. 20
      Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMSender.h
  28. 15
      Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMSenderDelegate.h
  29. 46
      Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMSystemInfo.h
  30. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/GeckoReporter.strings
  31. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMBugWindow.nib
  32. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMContactWindow.nib
  33. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMReportWindow.nib
  34. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/GeckoReporter.strings
  35. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMBugWindow.nib
  36. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMContactWindow.nib
  37. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMReportWindow.nib
  38. 42
      Frameworks/GeckoReporter.framework/Versions/A/Resources/Info.plist
  39. 27
      Frameworks/GeckoReporter.framework/Versions/A/Resources/License.txt
  40. 206
      Frameworks/GeckoReporter.framework/Versions/A/Resources/ModelNames.plist
  41. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/GeckoReporter.strings
  42. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMBugWindow.nib
  43. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMContactWindow.nib
  44. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMReportWindow.nib
  45. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/GeckoReporter.strings
  46. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMBugWindow.nib
  47. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMContactWindow.nib
  48. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMReportWindow.nib
  49. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/GeckoReporter.strings
  50. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMBugWindow.nib
  51. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMContactWindow.nib
  52. BIN
      Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMReportWindow.nib
  53. 1
      Frameworks/GeckoReporter.framework/Versions/Current
  54. 1
      Frameworks/Sparkle.framework/Headers
  55. 1
      Frameworks/Sparkle.framework/Resources
  56. 1
      Frameworks/Sparkle.framework/Sparkle
  57. 36
      Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h
  58. 54
      Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
  59. 126
      Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h
  60. 27
      Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
  61. 21
      Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h
  62. 24
      Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist
  63. 153
      Frameworks/Sparkle.framework/Versions/A/Resources/License.txt
  64. 174
      Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist
  65. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib
  66. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
  67. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
  68. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
  69. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
  70. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
  71. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
  72. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
  73. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
  74. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
  75. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
  76. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
  77. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
  78. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
  79. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
  80. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
  81. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
  82. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
  83. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
  84. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
  85. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
  86. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
  87. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
  88. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
  89. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
  90. 1
      Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
  91. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
  92. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
  93. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
  94. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
  95. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
  96. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
  97. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
  98. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings
  99. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
  100. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib

10
.gitignore

@ -0,0 +1,10 @@
build
*.zip
*.xcodeproj/*.pbxuser
*.xcodeproj/*.mode*
*.xcodeproj/*.perspective*
*.xcodeproj/xcuserdata
*.xcodeproj/project.xcworkspace/xcuserdata
*.xcworkspace/xcuserdata
Exhaust/*
Screenshots/*

14
Classes/MGMAddons.h

@ -0,0 +1,14 @@
//
// MGMAddons.h
// Exhaust
//
// Created by Mr. Gecko on 2/8/11.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Foundation/Foundation.h>
@interface NSBezierPath (MGMAddons)
+ (NSBezierPath *)pathWithRect:(NSRect)theRect radiusX:(float)theRadiusX radiusY:(float)theRadiusY;
- (void)fillGradientFrom:(NSColor *)theStartColor to:(NSColor *)theEndColor;
@end

78
Classes/MGMAddons.m

@ -0,0 +1,78 @@
//
// MGMAddons.m
// Exhaust
//
// Created by Mr. Gecko on 2/8/11.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMAddons.h"
#import <QuartzCore/QuartzCore.h>
@implementation NSBezierPath (MGMAddons)
+ (NSBezierPath *)pathWithRect:(NSRect)theRect radiusX:(float)theRadiusX radiusY:(float)theRadiusY {
NSBezierPath *path = [NSBezierPath bezierPath];
float maxRadiusX = theRect.size.width / 2.0;
float maxRadiusY = theRect.size.height / 2.0;
theRadiusX = (theRadiusX<maxRadiusX ? theRadiusX : maxRadiusX);
theRadiusY = (theRadiusY<maxRadiusY ? theRadiusY : maxRadiusY);
float ellipse = 0.55228474983079;
float controlX = theRadiusX * ellipse;
float controlY = theRadiusY * ellipse;
NSRect edges = NSInsetRect(theRect, theRadiusX, theRadiusY);
[path moveToPoint:NSMakePoint(edges.origin.x, theRect.origin.y)];
// top right corner
[path lineToPoint:NSMakePoint(NSMaxX(edges), theRect.origin.y)];
[path curveToPoint:NSMakePoint(NSMaxX(theRect), edges.origin.y) controlPoint1:NSMakePoint(NSMaxX(edges) + controlX, theRect.origin.y) controlPoint2:NSMakePoint(NSMaxX(theRect), edges.origin.y - controlY)];
// bottom right corner
[path lineToPoint:NSMakePoint(NSMaxX(theRect), NSMaxY(edges))];
[path curveToPoint:NSMakePoint(NSMaxX(edges), NSMaxY(theRect)) controlPoint1:NSMakePoint(NSMaxX(theRect), NSMaxY(edges) + controlY) controlPoint2:NSMakePoint(NSMaxX(edges) + controlX, NSMaxY(theRect))];
// bottom left corner
[path lineToPoint:NSMakePoint(edges.origin.x, NSMaxY(theRect))];
[path curveToPoint:NSMakePoint(theRect.origin.x, NSMaxY(edges)) controlPoint1:NSMakePoint(edges.origin.x - controlX, NSMaxY(theRect)) controlPoint2:NSMakePoint(theRect.origin.x, NSMaxY(edges) + controlY)];
// top left corner
[path lineToPoint:NSMakePoint(theRect.origin.x, edges.origin.y)];
[path curveToPoint:NSMakePoint(edges.origin.x, theRect.origin.y) controlPoint1:NSMakePoint(theRect.origin.x, edges.origin.y - controlY) controlPoint2:NSMakePoint(edges.origin.x - controlX, theRect.origin.y)];
[path closePath];
return path;
}
- (void)fillGradientFrom:(NSColor *)theStartColor to:(NSColor *)theEndColor {
CIFilter *filter = [CIFilter filterWithName:@"CILinearGradient"];
theStartColor = [theStartColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
theEndColor = [theEndColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
if (![[NSGraphicsContext currentContext] isFlipped]) {
NSColor *start = theStartColor;
NSColor *end = theEndColor;
theEndColor = start;
theStartColor = end;
}
CIColor *startColor = [CIColor colorWithRed:[theStartColor redComponent] green:[theStartColor greenComponent] blue:[theStartColor blueComponent] alpha:[theStartColor alphaComponent]];
CIColor *endColor = [CIColor colorWithRed:[theEndColor redComponent] green:[theEndColor greenComponent] blue:[theEndColor blueComponent] alpha:[theEndColor alphaComponent]];
[filter setValue:startColor forKey:@"inputColor0"];
[filter setValue:endColor forKey:@"inputColor1"];
CIVector *startVector = [CIVector vectorWithX:0.0 Y:0.0];
[filter setValue:startVector forKey:@"inputPoint0"];
CIVector *endVector = [CIVector vectorWithX:0.0 Y:[self bounds].size.height];
[filter setValue:endVector forKey:@"inputPoint1"];
CIImage *coreimage = [filter valueForKey:@"outputImage"];
[[NSGraphicsContext currentContext] saveGraphicsState];
[self setClip];
CIContext *context = [[NSGraphicsContext currentContext] CIContext];
[context drawImage:coreimage atPoint:CGPointMake([self bounds].origin.x, [self bounds].origin.y) fromRect:CGRectMake(0.0, 0.0, [self bounds].size.width, [self bounds].size.height)];
[[NSGraphicsContext currentContext] restoreGraphicsState];
}
@end

74
Classes/MGMController.h

@ -0,0 +1,74 @@
//
// MGMController.h
// Exhaust
//
// Created by Mr. Gecko on 8/7/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
#define exhaustdebug 0
@interface MGMController : NSObject {
IBOutlet NSWindow *mainWindow;
IBOutlet NSTableView *itemTable;
IBOutlet NSButton *removeButton;
IBOutlet NSButton *addButton;
IBOutlet NSMenu *addMenu;
NSMutableArray *startItems;
NSMutableArray *loginItems;
int itemIndex;
BOOL shouldContinue;
int selectedItem;
IBOutlet NSTextField *commandField;
IBOutlet NSButton *waitButton;
IBOutlet NSTextField *delayField;
IBOutlet NSTextField *quitField;
IBOutlet NSTableView *argumentsTable;
IBOutlet NSButton *argAddButton;
IBOutlet NSButton *argRemoveButton;
NSMutableArray *arguments;
ProcessSerialNumber frontProcess;
unsigned int windowCount;
NSTimer *updateTimer;
NSDate *lastModified;
}
- (void)registerDefaults;
- (NSString *)applicationSupportPath;
- (NSWindow *)mainWindow;
- (void)releaseMainWindow;
- (void)setFrontProcess:(ProcessSerialNumber *)theProcess;
- (void)becomeFront:(NSWindow *)theWindow;
- (void)resignFront;
- (void)loadItemsTo:(NSMutableArray **)theItems;
- (void)releaseStartItems;
- (void)releaseLoginItems;
- (BOOL)pathExists:(NSString *)thePath inItems:(NSMutableArray **)theItems;
- (void)startItems;
- (void)continueLaunching;
- (void)setEnabled:(BOOL)enabled;
- (IBAction)argAdd:(id)sender;
- (IBAction)argRemove:(id)sender;
- (IBAction)add:(id)sender;
- (IBAction)addApplication:(id)sender;
- (IBAction)addCommand:(id)sender;
- (IBAction)remove:(id)sender;
- (void)updateItems;
- (void)quit:(id)sender;
@end
@interface MGMBottomControl : NSView {
}
@end

720
Classes/MGMController.m

@ -0,0 +1,720 @@
//
// MGMController.m
// Exhaust
//
// Created by Mr. Gecko on 8/7/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMController.h"
#import "MGMFileManager.h"
#import "MGMLoginItems.h"
#import "MGMAddons.h"
#import <GeckoReporter/GeckoReporter.h>
#import <Carbon/Carbon.h>
NSString * const MGMApplicationSupport = @"~/Library/Application Support/MrGeckosMedia/";
NSString * const MGMSaveFile = @"loginItems.plist";
NSString * const MGMCommandKey = @"command";
NSString * const MGMWaitKey = @"wait";
NSString * const MGMDelayKey = @"delay";
NSString * const MGMQuitKey = @"quit";
NSString * const MGMArgumentsKey = @"arguments";
NSString * const MGMShouldContinueKey = @"shouldContinue";
NSString * const MGMIsApplicationKey = @"isApplication";
NSString * const MGMMacOS = @"MacOS";
NSString * const MGMSelfName = @"Exhaust.app";
NSString * const MGMTableDragType = @"MGMTableDragType";
NSString * const MGMArgTableDragType = @"MGMArgTableDragType";
NSString * const MGMFirstLaunch = @"firstLaunch";
NSString * const MGMLaunchCount = @"launchCount";
OSStatus frontAppChanged(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) {
ProcessSerialNumber thisProcess;
GetCurrentProcess(&thisProcess);
ProcessSerialNumber newProcess;
GetFrontProcess(&newProcess);
Boolean same;
SameProcess(&newProcess, &thisProcess, &same);
if (!same)
[(MGMController *)userData setFrontProcess:&newProcess];
return (CallNextEventHandler(nextHandler, theEvent));
}
@protocol NSSavePanelProtocol <NSObject>
- (void)setDirectoryURL:(NSURL *)url;
@end
@implementation MGMController
- (void)applicationDidFinishLaunching:(NSNotification *)theNotification {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setup) name:MGMGRDoneNotification object:nil];
[MGMReporter sharedReporter];
}
- (void)setup {
lastModified = nil;
NSNotificationCenter *workspaceCenter = [[NSWorkspace sharedWorkspace] notificationCenter];
[workspaceCenter addObserver:self selector:@selector(willLogout:) name:NSWorkspaceWillPowerOffNotification object:nil];
[workspaceCenter addObserver:self selector:@selector(applicationDidLaunch:) name:NSWorkspaceDidLaunchApplicationNotification object:nil];
[self registerDefaults];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey:MGMFirstLaunch]) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:NSLocalizedString(@"Welcome to Exhaust", nil)];
[alert setInformativeText:NSLocalizedString(@"Exhaust can be complicated at times, please be sure you read the documentation even if your the type of person who thinks he/she doesn't need to read documentation. If you haven't read the documentation, please quit now and read it.", nil)];
[alert addButtonWithTitle:NSLocalizedString(@"Quit", nil)];
[alert addButtonWithTitle:NSLocalizedString(@"Continue", nil)];
int result = [alert runModal];
if (result==1000) {
exit(0);
return;
} else if (result==1001) {
[defaults setBool:NO forKey:MGMFirstLaunch];
}
}
EventTypeSpec eventType;
eventType.eventClass = kEventClassApplication;
eventType.eventKind = kEventAppFrontSwitched;
EventHandlerUPP handlerUPP = NewEventHandlerUPP(frontAppChanged);
InstallApplicationEventHandler(handlerUPP, 1, &eventType, self, NULL);
if ([[MGMLoginItems items] selfExists]) {
[self startItems];
} else {
[[self mainWindow] makeKeyAndOrderFront:self];
[self becomeFront:[self mainWindow]];
}
updateTimer = [[NSTimer scheduledTimerWithTimeInterval:3600 target:self selector:@selector(updateItems) userInfo:nil repeats:YES] retain];
}
- (void)dealloc {
DisposeEventHandlerUPP(frontAppChanged);
[self releaseStartItems];
[self releaseMainWindow];
[updateTimer invalidate];
[updateTimer release];
[super dealloc];
}
- (void)registerDefaults {
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
[defaults setObject:[NSNumber numberWithBool:YES] forKey:MGMFirstLaunch];
[defaults setObject:[NSNumber numberWithInt:1] forKey:MGMLaunchCount];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}
- (NSString *)applicationSupportPath {
NSString *applicationName = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleExecutableKey];
NSString *applicationSupport = [[MGMApplicationSupport stringByExpandingTildeInPath] stringByAppendingPathComponent:applicationName];
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:applicationSupport])
[manager createDirectoryAtPath:applicationSupport withAttributes:nil];
return applicationSupport;
}
- (NSWindow *)mainWindow {
if (mainWindow==nil) {
if (![NSBundle loadNibNamed:@"ExuastWindow" owner:self]) {
NSLog(@"Unable to load the window.");
} else {
arguments = [NSMutableArray new];
[self loadItemsTo:&loginItems];
[itemTable registerForDraggedTypes:[NSArray arrayWithObjects:MGMTableDragType, NSFilenamesPboardType, nil]];
[argumentsTable registerForDraggedTypes:[NSArray arrayWithObject:MGMArgTableDragType]];
[self setEnabled:NO];
[removeButton setEnabled:NO];
selectedItem = -1;
[itemTable reloadData];
[mainWindow setLevel:NSFloatingWindowLevel];
}
}
return mainWindow;
}
- (void)releaseMainWindow {
[self releaseLoginItems];
[arguments release];
arguments = nil;
[mainWindow release];
mainWindow = nil;
itemTable = nil;
removeButton = nil;
addButton = nil;
addMenu = nil;
commandField = nil;
waitButton = nil;
delayField = nil;
quitField = nil;
argumentsTable = nil;
argAddButton = nil;
argRemoveButton = nil;
}
- (void)setFrontProcess:(ProcessSerialNumber *)theProcess {
frontProcess = *theProcess;
/*CFStringRef name;
CopyProcessName(theProcess, &name);
if (name!=NULL) {
NSLog(@"%@ became front", (NSString *)name);
CFRelease(name);
}*/
}
- (void)becomeFront:(NSWindow *)theWindow {
if (theWindow!=nil) {
windowCount++;
if ([[MGMSystemInfo info] isUIElement])
[theWindow setLevel:NSFloatingWindowLevel];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(frontWindowClosed:) name:NSWindowWillCloseNotification object:theWindow];
}
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
}
- (void)resignFront {
SetFrontProcess(&frontProcess);
//[[NSApplication sharedApplication] hide:self];
}
- (void)frontWindowClosed:(NSNotification *)theNotification {
[[NSNotificationCenter defaultCenter] removeObserver:self name:[theNotification name] object:[theNotification object]];
windowCount--;
if (windowCount==0)
[self resignFront];
}
- (void)loadItemsTo:(NSMutableArray **)theItems {
NSFileManager *manager = [NSFileManager defaultManager];
[*theItems release];
*theItems = nil;
if ([manager fileExistsAtPath:[[self applicationSupportPath] stringByAppendingPathComponent:MGMSaveFile]]) {
*theItems = [[NSMutableArray arrayWithContentsOfFile:[[self applicationSupportPath] stringByAppendingPathComponent:MGMSaveFile]] retain];
} else {
*theItems = [NSMutableArray new];
}
MGMLoginItems *items = [MGMLoginItems items];
[items removeSelf];
NSArray *paths = [items paths];
for (int i=0; i<[paths count]; i++) {
if ([[[paths objectAtIndex:i] lastPathComponent] isEqual:MGMSelfName])
continue;
NSString *path = [[NSBundle bundleWithPath:[paths objectAtIndex:i]] executablePath];
if ([manager fileExistsAtPath:path] && [manager isExecutableFileAtPath:path] && ![self pathExists:path inItems:theItems]) {
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:path forKey:MGMCommandKey];
[info setObject:[NSNumber numberWithBool:NO] forKey:MGMWaitKey];
[info setObject:[NSArray array] forKey:MGMArgumentsKey];
[*theItems addObject:info];
}
[items remove:[paths objectAtIndex:i]];
}
[items addSelf];
[lastModified release];
lastModified = nil;
NSDictionary *attributes = [manager attributesOfItemAtPath:[MGMLoginItemsPath stringByExpandingTildeInPath]];
if ([attributes objectForKey:NSFileModificationDate]!=nil)
lastModified = [[attributes objectForKey:NSFileModificationDate] retain];
}
- (void)releaseStartItems {
[startItems writeToFile:[[self applicationSupportPath] stringByAppendingPathComponent:MGMSaveFile] atomically:YES];
[startItems release];
startItems = nil;
}
- (void)releaseLoginItems {
if (selectedItem!=-1) {
NSFileManager *manager = [NSFileManager defaultManager];
if (![[commandField stringValue] isEqual:@""] && [manager fileExistsAtPath:[commandField stringValue]] && [manager isExecutableFileAtPath:[commandField stringValue]]) {
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:[commandField stringValue] forKey:MGMCommandKey];
[info setObject:[NSNumber numberWithBool:([waitButton state]==NSOnState ? YES : NO)] forKey:MGMWaitKey];
if ([delayField intValue]!=0)
[info setObject:[NSNumber numberWithFloat:[delayField floatValue]] forKey:MGMDelayKey];
if ([quitField intValue]!=0)
[info setObject:[NSNumber numberWithFloat:[quitField floatValue]] forKey:MGMQuitKey];
[info setObject:arguments forKey:MGMArgumentsKey];
[loginItems replaceObjectAtIndex:selectedItem withObject:info];
}
[itemTable deselectAll:self];
}
[itemTable reloadData];
[loginItems writeToFile:[[self applicationSupportPath] stringByAppendingPathComponent:MGMSaveFile] atomically:YES];
[loginItems release];
loginItems = nil;
}
- (BOOL)pathExists:(NSString *)thePath inItems:(NSMutableArray **)theItems {
for (int i=0; i<[*theItems count]; i++) {
if ([[[*theItems objectAtIndex:i] objectForKey:MGMCommandKey] isEqual:thePath])
return YES;
}
return NO;
}
- (void)startItems {
[self loadItemsTo:&startItems];
itemIndex = 0;
[self continueLaunching];
}
- (void)continueLaunching {
NSFileManager *manager = [NSFileManager defaultManager];
for (; itemIndex<[startItems count]; itemIndex++) {
NSMutableDictionary *info = [NSMutableDictionary dictionaryWithDictionary:[startItems objectAtIndex:itemIndex]];
#if exhaustdebug
NSLog(@"%d %@", itemIndex, [[info objectForKey:MGMCommandKey] lastPathComponent]);
#endif
shouldContinue = YES;
BOOL isApplication = NO;
NSString *path = [info objectForKey:MGMCommandKey];
if ([[[path stringByDeletingLastPathComponent] lastPathComponent] isEqual:MGMMacOS]) {
path = [[[path stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
NSBundle *bundle = [NSBundle bundleWithPath:path];
if (bundle!=nil && ![[bundle objectForInfoDictionaryKey:@"LSUIElement"] boolValue]) {
isApplication = YES;
#if exhaustdebug
NSLog(@"We are a application");
#endif
}
}
if (![manager fileExistsAtPath:[info objectForKey:MGMCommandKey]] || ![manager isExecutableFileAtPath:[info objectForKey:MGMCommandKey]]) {
[startItems removeObjectAtIndex:itemIndex];
itemIndex--;
continue;
}
if ((itemIndex+1)<[startItems count] && [[[startItems objectAtIndex:itemIndex+1] objectForKey:MGMWaitKey] boolValue]) {
shouldContinue = NO;
#if exhaustdebug
NSLog(@"We should not continue");
#endif
}
if ([info objectForKey:MGMDelayKey]!=nil) {
#if exhaustdebug
NSLog(@"We should Delay for %@ seconds", [info objectForKey:MGMDelayKey]);
#endif
[info setObject:[NSNumber numberWithBool:shouldContinue] forKey:MGMShouldContinueKey];
[info setObject:[NSNumber numberWithBool:isApplication] forKey:MGMIsApplicationKey];
[NSTimer scheduledTimerWithTimeInterval:[[info objectForKey:MGMDelayKey] floatValue] target:self selector:@selector(startItem:) userInfo:info repeats:NO];
} else {
@try {
NSTask *theTask = [NSTask launchedTaskWithLaunchPath:[info objectForKey:MGMCommandKey] arguments:[info objectForKey:MGMArgumentsKey]];
if (!isApplication && !shouldContinue) {
itemIndex++;
#if exhaustdebug
NSLog(@"We will continue in 15 seconds");
#endif
[NSTimer scheduledTimerWithTimeInterval:15.0 target:self selector:@selector(continueLaunching) userInfo:nil repeats:NO];
}
if ([info objectForKey:MGMQuitKey]!=nil) {
#if exhaustdebug
NSLog(@"We will quit in %@ seconds", [info objectForKey:MGMQuitKey]);
#endif
[NSTimer scheduledTimerWithTimeInterval:[[info objectForKey:MGMQuitKey] floatValue] target:self selector:@selector(quitItem:) userInfo:theTask repeats:NO];
}
}
@catch (NSException *e) {
NSLog(@"Unable to start %@: %@", [info objectForKey:MGMCommandKey], e);
}
}
if (!shouldContinue)
break;
#if exhaustdebug
NSLog(@"We are going on as we are continuing.");
#endif
}
if (itemIndex>=[startItems count])
[self releaseStartItems];
}
- (void)startItem:(NSTimer *)timer {
NSDictionary *info = [timer userInfo];
@try {
NSTask *theTask = [NSTask launchedTaskWithLaunchPath:[[timer userInfo] objectForKey:MGMCommandKey] arguments:[[timer userInfo] objectForKey:MGMArgumentsKey]];
if (![[info objectForKey:MGMIsApplicationKey] boolValue] && ![[info objectForKey:MGMShouldContinueKey] boolValue]) {
itemIndex++;
#if exhaustdebug
NSLog(@"We will continue in 15 seconds");
#endif
[NSTimer scheduledTimerWithTimeInterval:15.0 target:self selector:@selector(continueLaunching) userInfo:nil repeats:NO];
}
if ([info objectForKey:MGMQuitKey]!=nil) {
#if exhaustdebug
NSLog(@"We will quit in %@ seconds", [info objectForKey:MGMQuitKey]);
#endif
[NSTimer scheduledTimerWithTimeInterval:[[info objectForKey:MGMQuitKey] floatValue] target:self selector:@selector(quitItem:) userInfo:theTask repeats:NO];
}
}
@catch (NSException *e) {
NSLog(@"Unable to start %@: %@", [[timer userInfo] objectForKey:MGMCommandKey], e);
}
}
- (void)quitItem:(NSTimer *)timer {
[(NSTask *)[timer userInfo] terminate];
}
- (void)applicationDidLaunch:(NSNotification *)theNotification {
if (!shouldContinue) {
NSString *path = [[startItems objectAtIndex:itemIndex] objectForKey:MGMCommandKey];
if ([[[path stringByDeletingLastPathComponent] lastPathComponent] isEqual:MGMMacOS]) {
path = [[[path stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
}
if ([[[theNotification userInfo] objectForKey:@"NSApplicationPath"] isEqual:path]) {
#if exhaustdebug
NSLog(@"%@ launched, let's continue in 5 seconds.", [path lastPathComponent]);
#endif
itemIndex++;
[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(continueLaunching) userInfo:nil repeats:NO];
}
}
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag {
[[self mainWindow] makeKeyAndOrderFront:self];
[self becomeFront:[self mainWindow]];
if (!flag) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults integerForKey:MGMLaunchCount]!=3) {
[defaults setInteger:[defaults integerForKey:MGMLaunchCount]+1 forKey:MGMLaunchCount];
if ([defaults integerForKey:MGMLaunchCount]==3) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:NSLocalizedString(@"Donations", nil)];
[alert setInformativeText:NSLocalizedString(@"Thank you for using Exhast, if you like Exhaust, consider sending a donation.", nil)];
[alert addButtonWithTitle:NSLocalizedString(@"Yes", nil)];
[alert addButtonWithTitle:NSLocalizedString(@"No", nil)];
int result = [alert runModal];
if (result==1000)
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MGCBN8NHD8VQW"]];
}
}
}
return YES;
}
- (void)setEnabled:(BOOL)enabled {
[commandField setEnabled:enabled];
[waitButton setEnabled:enabled];
[delayField setEnabled:enabled];
[quitField setEnabled:enabled];
[argumentsTable setEnabled:enabled];
[argAddButton setEnabled:enabled];
[argRemoveButton setEnabled:enabled];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)theTableView {
if (theTableView==itemTable) {
return [loginItems count];
} else if (theTableView==argumentsTable) {
return [arguments count];
}
return 0;
}
- (id)tableView:(NSTableView *)theTableView objectValueForTableColumn:(NSTableColumn *)theTableColumn row:(NSInteger)theRowIndex {
if (theTableView==itemTable) {
NSDictionary *info = [loginItems objectAtIndex:theRowIndex];
if ([[theTableColumn identifier] isEqual:@"name"]) {
return [[info objectForKey:MGMCommandKey] lastPathComponent];
} else if ([[theTableColumn identifier] isEqual:@"icon"]) {
NSString *path = [info objectForKey:MGMCommandKey];
if ([[[path stringByDeletingLastPathComponent] lastPathComponent] isEqual:MGMMacOS]) {
path = [[[path stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
}
return [[NSWorkspace sharedWorkspace] iconForFile:path];
}
} else if (theTableView==argumentsTable) {
return [arguments objectAtIndex:theRowIndex];
}
return nil;
}
- (void)tableView:(NSTableView *)theTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)theTableColumn row:(NSInteger)theRowIndex {
if (theTableView==argumentsTable)
[arguments replaceObjectAtIndex:theRowIndex withObject:anObject];
}
- (BOOL)tableView:(NSTableView *)theTableView writeRowsWithIndexes:(NSIndexSet *)theRowIndexes toPasteboard:(NSPasteboard *)thePboard {
if (theTableView==itemTable) {
NSMutableArray *items = [NSMutableArray array];
long index = [theRowIndexes lastIndex];
while (index!=NSNotFound) {
NSDictionary *item = [loginItems objectAtIndex:index];
[items addObject:item];
index = [theRowIndexes indexLessThanIndex:index];
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:items];
[thePboard declareTypes:[NSArray arrayWithObject:MGMTableDragType] owner:self];
[thePboard setData:data forType:MGMTableDragType];
[itemTable deselectAll:self];
} else if (theTableView==argumentsTable) {
NSMutableArray *items = [NSMutableArray array];
long index = [theRowIndexes lastIndex];
while (index!=NSNotFound) {
NSDictionary *item = [arguments objectAtIndex:index];
[items addObject:item];
index = [theRowIndexes indexLessThanIndex:index];
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:items];
[thePboard declareTypes:[NSArray arrayWithObject:MGMArgTableDragType] owner:self];
[thePboard setData:data forType:MGMArgTableDragType];
[argumentsTable deselectAll:self];
}
return YES;
}
- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id < NSDraggingInfo >)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation {
return NSDragOperationEvery;
}
- (BOOL)tableView:(NSTableView *)theTableView acceptDrop:(id < NSDraggingInfo >)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation {
if (theTableView==itemTable) {
if ([[info draggingPasteboard] dataForType:MGMTableDragType]!=nil) {
NSArray *items = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:MGMTableDragType]];
for (int i=0; i<[items count]; i++) {
int index = [loginItems indexOfObject:[items objectAtIndex:i]];
if (row>=index)
row--;
[loginItems removeObjectAtIndex:index];
}
[itemTable reloadData];
for (long i=0; i<[items count]; i++) {
[loginItems insertObject:[items objectAtIndex:i] atIndex:row];
}
[itemTable reloadData];
[itemTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
return YES;
} else if ([[info draggingPasteboard] propertyListForType:NSFilenamesPboardType]!=nil) {
NSArray *paths = [[info draggingPasteboard] propertyListForType:NSFilenamesPboardType];
BOOL foundResults = NO;
for (int i=0; i<[paths count]; i++) {
if ([[[[paths objectAtIndex:i] pathExtension] lowercaseString] isEqual:@"app"]) {
if ([[[paths objectAtIndex:i] lastPathComponent] isEqual:MGMSelfName])
return NO;
NSString *path = [[NSBundle bundleWithPath:[paths objectAtIndex:i]] executablePath];
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:path] && [manager isExecutableFileAtPath:path] && ![self pathExists:path inItems:&loginItems]) {
foundResults = YES;
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:path forKey:MGMCommandKey];
[info setObject:[NSNumber numberWithBool:NO] forKey:MGMWaitKey];
[info setObject:[NSArray array] forKey:MGMArgumentsKey];
[loginItems addObject:info];
[itemTable reloadData];
[itemTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[loginItems count]-1] byExtendingSelection:NO];
}
}
}
return foundResults;
}
} else if (theTableView==argumentsTable) {
if ([[info draggingPasteboard] dataForType:MGMArgTableDragType]!=nil) {
NSArray *items = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:MGMArgTableDragType]];
for (int i=0; i<[items count]; i++) {
int index = [arguments indexOfObject:[items objectAtIndex:i]];
if (row>=index)
row--;
[arguments removeObjectAtIndex:index];
}
[argumentsTable reloadData];
for (int i=0; i<[items count]; i++) {
[arguments insertObject:[items objectAtIndex:i] atIndex:row];
}
[argumentsTable reloadData];
[argumentsTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
return YES;
}
}
return NO;
}
- (void)tableViewSelectionDidChange:(NSNotification *)theNotification {
if ([theNotification object]==itemTable) {
[removeButton setEnabled:YES];
if (selectedItem!=-1) {
NSFileManager *manager = [NSFileManager defaultManager];
if ([[commandField stringValue] isEqual:@""] || ![manager fileExistsAtPath:[commandField stringValue]] || ![manager isExecutableFileAtPath:[commandField stringValue]]) {
NSBeep();
} else {
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:[commandField stringValue] forKey:MGMCommandKey];
[info setObject:[NSNumber numberWithBool:([waitButton state]==NSOnState ? YES : NO)] forKey:MGMWaitKey];
if ([delayField intValue]!=0)
[info setObject:[NSNumber numberWithFloat:[delayField floatValue]] forKey:MGMDelayKey];
if ([quitField intValue]!=0)
[info setObject:[NSNumber numberWithFloat:[quitField floatValue]] forKey:MGMQuitKey];
[info setObject:arguments forKey:MGMArgumentsKey];
[loginItems replaceObjectAtIndex:selectedItem withObject:info];
}
}
if ([[itemTable selectedRowIndexes] count]==1) {
[self setEnabled:YES];
selectedItem = [itemTable selectedRow];
NSDictionary *info = [loginItems objectAtIndex:selectedItem];
[commandField setStringValue:[info objectForKey:MGMCommandKey]];
[waitButton setState:([[info objectForKey:MGMWaitKey] boolValue] ? NSOnState : NSOffState)];
if ([info objectForKey:MGMDelayKey]==nil)
[delayField setStringValue:@""];
else
[delayField setIntValue:[[info objectForKey:MGMDelayKey] floatValue]];
if ([info objectForKey:MGMQuitKey]==nil)
[quitField setStringValue:@""];
else
[quitField setIntValue:[[info objectForKey:MGMQuitKey] floatValue]];
if (arguments!=nil) [arguments release];
arguments = [[NSMutableArray arrayWithArray:[info objectForKey:MGMArgumentsKey]] retain];
[argRemoveButton setEnabled:NO];
} else {
selectedItem = -1;
[commandField setStringValue:@""];
[waitButton setState:NSOffState];
[delayField setStringValue:@""];
[quitField setStringValue:@""];
if (arguments!=nil) [arguments release];
arguments = [NSMutableArray new];
if ([[itemTable selectedRowIndexes] count]==0) {
[removeButton setEnabled:NO];
}
[self setEnabled:NO];
}
[argumentsTable reloadData];
} else if ([theNotification object]==argumentsTable) {
[argRemoveButton setEnabled:([[argumentsTable selectedRowIndexes] count]!=0)];
}
}
- (IBAction)argAdd:(id)sender {
[arguments addObject:@""];
[argumentsTable reloadData];
[argumentsTable editColumn:0 row:[arguments count]-1 withEvent:nil select:YES];
}
- (IBAction)argRemove:(id)sender {
[arguments removeObjectAtIndex:[argumentsTable selectedRow]];
[argumentsTable reloadData];
}
- (IBAction)add:(id)sender {
NSPoint location = [addButton frame].origin;
location.y += 20;
NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouseUp location:location modifierFlags:0 timestamp:0 windowNumber:[mainWindow windowNumber] context:nil eventNumber:0 clickCount:1 pressure:0];
[NSMenu popUpContextMenu:addMenu withEvent:event forView:addButton];
}
- (IBAction)addApplication:(id)sender {
NSOpenPanel<NSSavePanelProtocol> *panel = [NSOpenPanel openPanel];
[panel setCanChooseFiles:YES];
[panel setCanChooseDirectories:NO];
[panel setResolvesAliases:YES];
[panel setAllowsMultipleSelection:NO];
[panel setAllowedFileTypes:[NSArray arrayWithObject:@"app"]];
[panel setTreatsFilePackagesAsDirectories:NO];
int returnCode;
if ([panel respondsToSelector:@selector(runModalForDirectory:file:)]) {
returnCode = [panel runModalForDirectory:@"/Applications/" file:nil];
} else {
[panel setDirectoryURL:[NSURL fileURLWithPath:@"/Applications/"]];
returnCode = [panel runModal];
}
if (returnCode==NSOKButton) {
if ([[[[panel URL] path] lastPathComponent] isEqual:MGMSelfName])
return;
NSString *path = [[NSBundle bundleWithPath:[[panel URL] path]] executablePath];
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:path] && [manager isExecutableFileAtPath:path] && ![self pathExists:path inItems:&loginItems]) {
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:path forKey:MGMCommandKey];
[info setObject:[NSNumber numberWithBool:NO] forKey:MGMWaitKey];
[info setObject:[NSArray array] forKey:MGMArgumentsKey];
[loginItems addObject:info];
[itemTable reloadData];
[itemTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[loginItems count]-1] byExtendingSelection:NO];
}
}
}
- (IBAction)addCommand:(id)sender {
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:@"/bin/bash" forKey:MGMCommandKey];
[info setObject:[NSNumber numberWithBool:NO] forKey:MGMWaitKey];
[info setObject:[NSArray arrayWithObject:@"-c"] forKey:MGMArgumentsKey];
[loginItems addObject:info];
[itemTable reloadData];
[itemTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[loginItems count]-1] byExtendingSelection:NO];
}
- (IBAction)remove:(id)sender {
NSIndexSet *indexes = [itemTable selectedRowIndexes];
if ([indexes count]==1) {
[loginItems removeObjectAtIndex:[itemTable selectedRow]];
} else {
NSMutableArray *items = [NSMutableArray new];
long index = [indexes lastIndex];
while (index!=NSNotFound) {
[items addObject:[loginItems objectAtIndex:index]];
index = [indexes indexLessThanIndex:index];
}
for (int i=0; i<[items count]; i++) {
[loginItems removeObject:[items objectAtIndex:i]];
}
[items release];
}
selectedItem = -1;
[itemTable reloadData];
[itemTable deselectAll:self];
}
- (void)updateItems {
if (loginItems==nil && startItems==nil) {
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[MGMLoginItemsPath stringByExpandingTildeInPath]];
NSDate *modifiedDate = [attributes objectForKey:NSFileModificationDate];
if (modifiedDate!=nil || lastModified==nil || (![modifiedDate isEqual:lastModified] && [modifiedDate laterDate:lastModified]==modifiedDate)) {
[self loadItemsTo:&startItems];
[self releaseStartItems];
}
}
}
- (void)windowWillClose:(NSNotification *)theNotification {
[self releaseMainWindow];
}
- (void)willLogout:(NSNotification *)theNotification {
if (mainWindow!=nil) [self releaseMainWindow];
[self updateItems];
}
- (void)updaterWillRelaunchApplication {
MGMLoginItems *items = [MGMLoginItems items];
[items removeSelf];
if (mainWindow!=nil) [self releaseMainWindow];
if (startItems==nil) [self loadItemsTo:&startItems];
for (int i=0; i<[startItems count]; i++) {
NSString *path = [[startItems objectAtIndex:i] objectForKey:MGMCommandKey];
if ([[[path stringByDeletingLastPathComponent] lastPathComponent] isEqual:MGMMacOS]) {
path = [[[path stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
NSBundle *bundle = [NSBundle bundleWithPath:path];
if (bundle!=nil) {
[items add:path];
}
}
}
}
- (void)quit:(id)sender {
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:NSLocalizedString(@"Are you sure you want to quit?", nil)];
[alert setInformativeText:NSLocalizedString(@"When you quit, you will remove all items and place it back into Apple's login system. Are you sure you want to do that? If not just hit cancel and close the window instead.", nil)];
[alert addButtonWithTitle:NSLocalizedString(@"Quit", nil)];
[alert addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
int returnValue = [alert runModal];
if (returnValue==1000) {
MGMLoginItems *items = [MGMLoginItems items];
[items removeSelf];
if (mainWindow!=nil) [self releaseMainWindow];
if (startItems==nil) [self loadItemsTo:&startItems];
for (int i=0; i<[startItems count]; i++) {
NSString *path = [[startItems objectAtIndex:i] objectForKey:MGMCommandKey];
if ([[[path stringByDeletingLastPathComponent] lastPathComponent] isEqual:MGMMacOS]) {
path = [[[path stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
NSBundle *bundle = [NSBundle bundleWithPath:path];
if (bundle!=nil) {
[items add:path];
}
}
}
[[NSApplication sharedApplication] terminate:self];
}
}
@end
@implementation MGMBottomControl
- (void)drawRect:(NSRect)rect {
NSBezierPath *path = [NSBezierPath bezierPathWithRect:[self frame]];
[path fillGradientFrom:[NSColor colorWithCalibratedWhite:0.992156 alpha:1.0] to:[NSColor colorWithCalibratedWhite:0.886274 alpha:1.0]];
}
@end

23
Classes/MGMFileManager.h

@ -0,0 +1,23 @@
//
// MGMFileManager.h
// Exhaust
//
// Created by Mr. Gecko on 1/22/11.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@interface NSFileManager (MGMFileManager)
- (BOOL)moveItemAtPath:(NSString *)thePath toPath:(NSString *)theDestination;
- (BOOL)copyItemAtPath:(NSString *)thePath toPath:(NSString *)theDestination;
- (BOOL)removeItemAtPath:(NSString *)thePath;
- (BOOL)linkItemAtPath:(NSString *)thePath toPath:(NSString *)theDestination;
- (BOOL)createDirectoryAtPath:(NSString *)thePath withAttributes:(NSDictionary *)theAttributes;
- (BOOL)createSymbolicLinkAtPath:(NSString *)thePath withDestinationPath:(NSString *)theDestination;
- (NSString *)destinationOfSymbolicLinkAtPath:(NSString *)thePath;
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)thePath;
- (NSDictionary *)attributesOfFileSystemForPath:(NSString *)thePath;
- (void)setAttributes:(NSDictionary *)theAttributes ofItemAtPath:(NSString *)thePath;
- (NSDictionary *)attributesOfItemAtPath:(NSString *)thePath;
@end

86
Classes/MGMFileManager.m

@ -0,0 +1,86 @@
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
//
// MGMFileManager.m
// Exhaust
//
// Created by Mr. Gecko on 1/22/11.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMFileManager.h"
@implementation NSFileManager (MGMFileManager)
- (BOOL)moveItemAtPath:(NSString *)thePath toPath:(NSString *)theDestination {
if ([self respondsToSelector:@selector(movePath:toPath:handler:)])
return [self movePath:thePath toPath:theDestination handler:nil];
else
return [self moveItemAtPath:thePath toPath:theDestination error:nil];
}
- (BOOL)copyItemAtPath:(NSString *)thePath toPath:(NSString *)theDestination {
if ([self respondsToSelector:@selector(copyPath:toPath:handler:)])
return [self copyPath:thePath toPath:theDestination handler:nil];
else
return [self copyItemAtPath:thePath toPath:theDestination error:nil];
}
- (BOOL)removeItemAtPath:(NSString *)thePath {
if ([self respondsToSelector:@selector(removeFileAtPath:handler:)])
return [self removeFileAtPath:thePath handler:nil];
else
return [self removeItemAtPath:thePath error:nil];
}
- (BOOL)linkItemAtPath:(NSString *)thePath toPath:(NSString *)theDestination {
if ([self respondsToSelector:@selector(linkPath:toPath:handler:)])
return [self linkPath:thePath toPath:theDestination handler:nil];
else
return [self linkItemAtPath:thePath toPath:theDestination error:nil];
}
- (BOOL)createDirectoryAtPath:(NSString *)thePath withAttributes:(NSDictionary *)theAttributes {
if ([self respondsToSelector:@selector(createDirectoryAtPath:attributes:)]) {
BOOL isDirectory;
if (![self fileExistsAtPath:thePath isDirectory:&isDirectory] && ![[thePath stringByDeletingLastPathComponent] isEqual:@""])
[self createDirectoryAtPath:[thePath stringByDeletingLastPathComponent] withAttributes:nil];
else if (!isDirectory || [[thePath stringByDeletingLastPathComponent] isEqual:@""])
return false;
return [self createDirectoryAtPath:thePath attributes:theAttributes];
} else {
return [self createDirectoryAtPath:thePath withIntermediateDirectories:YES attributes:theAttributes error:nil];
}
return false;
}
- (BOOL)createSymbolicLinkAtPath:(NSString *)thePath withDestinationPath:(NSString *)theDestination {
if ([self respondsToSelector:@selector(createSymbolicLinkAtPath:pathContent:)])
return [self createSymbolicLinkAtPath:thePath pathContent:theDestination];
else
return [self createSymbolicLinkAtPath:thePath withDestinationPath:theDestination error:nil];
}
- (NSString *)destinationOfSymbolicLinkAtPath:(NSString *)thePath {
if ([self respondsToSelector:@selector(pathContentOfSymbolicLinkAtPath:)])
return [self pathContentOfSymbolicLinkAtPath:thePath];
else
return [self destinationOfSymbolicLinkAtPath:thePath error:nil];
}
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)thePath {
if ([self respondsToSelector:@selector(directoryContentsAtPath:)])
return [self directoryContentsAtPath:thePath];
else
return [self contentsOfDirectoryAtPath:thePath error:nil];
}
- (NSDictionary *)attributesOfFileSystemForPath:(NSString *)thePath {
if ([self respondsToSelector:@selector(fileSystemAttributesAtPath:)])
return [self fileSystemAttributesAtPath:thePath];
else
return [self attributesOfFileSystemForPath:thePath error:nil];
}
- (void)setAttributes:(NSDictionary *)theAttributes ofItemAtPath:(NSString *)thePath {
if ([self respondsToSelector:@selector(changeFileAttributes:atPath:)])
[self changeFileAttributes:theAttributes atPath:thePath];
else
[self setAttributes:theAttributes ofItemAtPath:thePath error:nil];
}
- (NSDictionary *)attributesOfItemAtPath:(NSString *)thePath {
if ([self respondsToSelector:@selector(fileAttributesAtPath:traverseLink:)])
return [self fileAttributesAtPath:thePath traverseLink:YES];
else
return [self attributesOfItemAtPath:thePath error:nil];
}
@end

26
Classes/MGMLoginItems.h

@ -0,0 +1,26 @@
//
// MGMLoginItems.h
// Exhaust
//
// Created by Mr. Gecko on 8/7/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
extern NSString * const MGMLoginItemsPath;
@interface MGMLoginItems : NSObject {
NSMutableDictionary *loginItems;
}
+ (id)items;
- (NSArray *)paths;
- (BOOL)selfExists;
- (BOOL)addSelf;
- (BOOL)removeSelf;
- (BOOL)exists:(NSString *)thePath;
- (BOOL)add:(NSString *)thePath;
- (BOOL)add:(NSString *)thePath hide:(BOOL)shouldHide;
- (BOOL)remove:(NSString *)thePath;
- (void)_save;
@end

89
Classes/MGMLoginItems.m

@ -0,0 +1,89 @@
//
// MGMLoginItems.m
// Exhaust
//
// Created by Mr. Gecko on 8/7/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMLoginItems.h"
NSString * const MGMLoginItemsPath = @"~/Library/Preferences/loginwindow.plist";
NSString * const MGMItemsKey = @"AutoLaunchedApplicationDictionary";
NSString * const MGMPathKey = @"Path";
NSString * const MGMHideKey = @"Hide";
@implementation MGMLoginItems
+ (id)items {
return [[[self alloc] init] autorelease];
}
- (id)init {
if ((self = [super init])) {
loginItems = [[NSMutableDictionary dictionaryWithContentsOfFile:[MGMLoginItemsPath stringByExpandingTildeInPath]] retain];
}
return self;
}
- (void)dealloc {
[loginItems release];
[super dealloc];
}
- (NSArray *)paths {
NSMutableArray *returnApps = [NSMutableArray array];
NSArray *applications = [loginItems objectForKey:MGMItemsKey];
for (int i=0; i<[applications count]; i++) {
[returnApps addObject:[[applications objectAtIndex:i] objectForKey:MGMPathKey]];
}
return returnApps;
}
- (BOOL)selfExists {
return [self exists:[[NSBundle mainBundle] bundlePath]];
}
- (BOOL)addSelf {
return [self add:[[NSBundle mainBundle] bundlePath]];
}
- (BOOL)removeSelf {
return [self remove:[[NSBundle mainBundle] bundlePath]];
}
- (BOOL)exists:(NSString *)thePath {
NSArray *applications = [loginItems objectForKey:MGMItemsKey];
for (int i=0; i<[applications count]; i++) {
if ([[[applications objectAtIndex:i] objectForKey:MGMPathKey] isEqual:thePath])
return YES;
}
return NO;
}
- (BOOL)add:(NSString *)thePath {
return [self add:thePath hide:NO];
}
- (BOOL)add:(NSString *)thePath hide:(BOOL)shouldHide {
if ([self exists:thePath])
return NO;
NSMutableArray *applications = [NSMutableArray arrayWithArray:[loginItems objectForKey:MGMItemsKey]];
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:thePath forKey:MGMPathKey];
[info setObject:[NSNumber numberWithBool:shouldHide] forKey:MGMHideKey];
[applications addObject:info];
[loginItems setObject:applications forKey:MGMItemsKey];
[self _save];
return YES;
}
- (BOOL)remove:(NSString *)thePath {
NSMutableArray *applications = [NSMutableArray arrayWithArray:[loginItems objectForKey:MGMItemsKey]];
for (int i=0; i<[applications count]; i++) {
if ([[[applications objectAtIndex:i] objectForKey:MGMPathKey] isEqual:thePath]) {
[applications removeObjectAtIndex:i];
[loginItems setObject:applications forKey:MGMItemsKey];
[self _save];
return YES;
}
}
return NO;
}
- (void)_save {
[loginItems writeToFile:[MGMLoginItemsPath stringByExpandingTildeInPath] atomically:YES];
}
@end

14
Classes/main.m

@ -0,0 +1,14 @@
//
// main.m
// Exhaust
//
// Created by Mr. Gecko on 8/7/10.
// Copyright 2010 Mr. Gecko's Media. All rights reserved.
//
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}

13
Classes/prefix.pch

@ -0,0 +1,13 @@
/*
* Preifx.pch
* Exhaust
*
* Created by Mr. Gecko on 12/27/09.
* Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
*
*/
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif

6
Contributing.txt

@ -0,0 +1,6 @@
Contributing to Exhaust. If you want to contribute to Exhaust, here is what I will do: 1. Add your name (and email if provided) to the change describing what you changed. 2. Add your name (and email/website if provided) to the contributors section.
Terms for adding:
1. The patch must not disrupt up the functionality of Exhaust. 2. The patch must provide useful changes.
3. Anything that you add to the source code of Exhaust will be under the terms of my licenses.
4. If you add changes to Exhaust's source code, you may not have them removed, but you will get credit for the changes in the history of the application. To contribute: 1. Create a patch file using this command “diff -crB ExhaustOriginal Exhaust > Exhaust.patch”. 2. Send the patch to exhaust@mrgeckosmedia.com with your name, email/website (if you want that information), and what you changed so I can add it to the about and change.

BIN
Documentation.pages

1652
Exhaust.ai
File diff suppressed because it is too large
View File

BIN
Exhaust.icns

BIN
Exhaust.png

After

Width: 512  |  Height: 512  |  Size: 49 KiB

500
Exhaust.xcodeproj/project.pbxproj

@ -0,0 +1,500 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
/* Begin PBXAggregateTarget section */
2A9E36601301B6F100F40B5F /* Build Directory */ = {
isa = PBXAggregateTarget;
buildConfigurationList = 2A9E36611301B6F200F40B5F /* Build configuration list for PBXAggregateTarget "Build Directory" */;
buildPhases = (
2A9E36641301B70D00F40B5F /* ShellScript */,
);
dependencies = (
);
name = "Build Directory";
productName = "Build Directory";
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
2A1A48FC130595C50032D844 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A1A48FB130595C50032D844 /* Carbon.framework */; };
2A9E36691301B79100F40B5F /* MGMFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9E36681301B79000F40B5F /* MGMFileManager.m */; };
2A9E36771301C8D300F40B5F /* MGMAddons.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9E36761301C8D100F40B5F /* MGMAddons.m */; };
2A9E367B1301C97300F40B5F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A9E367A1301C97300F40B5F /* QuartzCore.framework */; };
2A9E367E1301CA3D00F40B5F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9E367D1301CA3D00F40B5F /* main.m */; };
2AC4C05B1301D8CB00712FB7 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 2AC4C0451301D8CB00712FB7 /* dsa_pub.pem */; };
2AC4C05C1301D8CB00712FB7 /* ExuastWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AC4C0461301D8CB00712FB7 /* ExuastWindow.xib */; };
2AC4C05D1301D8CB00712FB7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2AC4C0481301D8CB00712FB7 /* InfoPlist.strings */; };
2AC4C05E1301D8CB00712FB7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2AC4C04A1301D8CB00712FB7 /* Localizable.strings */; };
2AC4C05F1301D8CB00712FB7 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AC4C04C1301D8CB00712FB7 /* MainMenu.xib */; };
2AC4C0D31301E21C00712FB7 /* GeckoReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AC4C0D21301E21C00712FB7 /* GeckoReporter.framework */; };
2AC4C0D51301E22500712FB7 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AC4C0D41301E22500712FB7 /* Sparkle.framework */; };
2AC4C0D61301E23100712FB7 /* GeckoReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AC4C0D21301E21C00712FB7 /* GeckoReporter.framework */; };
2AC4C0D71301E23400712FB7 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AC4C0D41301E22500712FB7 /* Sparkle.framework */; };
2AC4C0E51301E2DC00712FB7 /* Exhaust.icns in Resources */ = {isa = PBXBuildFile; fileRef = 2AC4C0E41301E2DC00712FB7 /* Exhaust.icns */; };
2AF65A30120E048A00DC0A49 /* MGMController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AF65A2D120E048A00DC0A49 /* MGMController.m */; };
2AF65A31120E048A00DC0A49 /* MGMLoginItems.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AF65A2F120E048A00DC0A49 /* MGMLoginItems.m */; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
2A9E36651301B73F00F40B5F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
proxyType = 1;
remoteGlobalIDString = 2A9E36601301B6F100F40B5F;
remoteInfo = "Build Directory";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
2AF65EF8120F65D000DC0A49 /* Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
2AC4C0D61301E23100712FB7 /* GeckoReporter.framework in Frameworks */,
2AC4C0D71301E23400712FB7 /* Sparkle.framework in Frameworks */,
);
name = Frameworks;
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
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>"; };
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
2A1A48FB130595C50032D844 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = ../../../System/Library/Frameworks/Carbon.framework; sourceTree = "<group>"; };
2A9E36671301B79000F40B5F /* MGMFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMFileManager.h; sourceTree = "<group>"; };
2A9E36681301B79000F40B5F /* MGMFileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMFileManager.m; sourceTree = "<group>"; };
2A9E36751301C8CD00F40B5F /* MGMAddons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMAddons.h; sourceTree = "<group>"; };
2A9E36761301C8D100F40B5F /* MGMAddons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMAddons.m; sourceTree = "<group>"; };
2A9E367A1301C97300F40B5F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = ../../../System/Library/Frameworks/QuartzCore.framework; sourceTree = "<group>"; };
2A9E367D1301CA3D00F40B5F /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Classes/main.m; sourceTree = "<group>"; };
2A9E367F1301CA4600F40B5F /* prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = prefix.pch; path = Classes/prefix.pch; sourceTree = "<group>"; };
2AC4C0451301D8CB00712FB7 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_pub.pem; sourceTree = "<group>"; };
2AC4C0471301D8CB00712FB7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/ExuastWindow.xib; sourceTree = "<group>"; };
2AC4C0491301D8CB00712FB7 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
2AC4C04B1301D8CB00712FB7 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = "<group>"; };
2AC4C04D1301D8CB00712FB7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
2AC4C04E1301D8CB00712FB7 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/ExuastWindow.xib; sourceTree = "<group>"; };
2AC4C04F1301D8CB00712FB7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
2AC4C0501301D8CB00712FB7 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/MainMenu.xib; sourceTree = "<group>"; };
2AC4C0511301D8CB00712FB7 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/ExuastWindow.xib; sourceTree = "<group>"; };
2AC4C0521301D8CB00712FB7 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
2AC4C0531301D8CB00712FB7 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/MainMenu.xib; sourceTree = "<group>"; };
2AC4C0551301D8CB00712FB7 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "pt-PT"; path = "pt-PT.lproj/ExuastWindow.xib"; sourceTree = "<group>"; };
2AC4C0561301D8CB00712FB7 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
2AC4C0571301D8CB00712FB7 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "pt-PT"; path = "pt-PT.lproj/MainMenu.xib"; sourceTree = "<group>"; };
2AC4C0581301D8CB00712FB7 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/ExuastWindow.xib; sourceTree = "<group>"; };
2AC4C0591301D8CB00712FB7 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = "<group>"; };
2AC4C05A1301D8CB00712FB7 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/MainMenu.xib; sourceTree = "<group>"; };
2AC4C0611301D8E000712FB7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
2AC4C0D21301E21C00712FB7 /* GeckoReporter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GeckoReporter.framework; path = Frameworks/GeckoReporter.framework; sourceTree = "<group>"; };
2AC4C0D41301E22500712FB7 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Frameworks/Sparkle.framework; sourceTree = "<group>"; };
2AC4C0E41301E2DC00712FB7 /* Exhaust.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Exhaust.icns; sourceTree = SOURCE_ROOT; };
2AF65A2C120E048A00DC0A49 /* MGMController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMController.h; sourceTree = "<group>"; };
2AF65A2D120E048A00DC0A49 /* MGMController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMController.m; sourceTree = "<group>"; };
2AF65A2E120E048A00DC0A49 /* MGMLoginItems.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMLoginItems.h; sourceTree = "<group>"; };
2AF65A2F120E048A00DC0A49 /* MGMLoginItems.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMLoginItems.m; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* Exhaust.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Exhaust.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8D11072E0486CEB800E47090 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
2A9E367B1301C97300F40B5F /* QuartzCore.framework in Frameworks */,
2AC4C0D31301E21C00712FB7 /* GeckoReporter.framework in Frameworks */,
2AC4C0D51301E22500712FB7 /* Sparkle.framework in Frameworks */,
2A1A48FC130595C50032D844 /* Carbon.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
2A1A48FB130595C50032D844 /* Carbon.framework */,
2AC4C0D21301E21C00712FB7 /* GeckoReporter.framework */,
2AC4C0D41301E22500712FB7 /* Sparkle.framework */,
2A9E367A1301C97300F40B5F /* QuartzCore.framework */,
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
);
name = "Linked Frameworks";
sourceTree = "<group>";
};
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
isa = PBXGroup;
children = (
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
19C28FACFE9D520D11CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
8D1107320486CEB800E47090 /* Exhaust.app */,
);
name = Products;
sourceTree = "<group>";
};
29B97314FDCFA39411CA2CEA /* Exhaust */ = {
isa = PBXGroup;
children = (
2AF65A2B120E048A00DC0A49 /* Classes */,
29B97315FDCFA39411CA2CEA /* Other Sources */,
2AC4C0441301D8CB00712FB7 /* Resources */,
29B97323FDCFA39411CA2CEA /* Frameworks */,
19C28FACFE9D520D11CA2CBB /* Products */,
);
name = Exhaust;
sourceTree = "<group>";
};
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
isa = PBXGroup;
children = (
2A9E367F1301CA4600F40B5F /* prefix.pch */,
2A9E367D1301CA3D00F40B5F /* main.m */,
);
name = "Other Sources";
sourceTree = "<group>";
};
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
);
name = Frameworks;
sourceTree = "<group>";
};
2AC4C0441301D8CB00712FB7 /* Resources */ = {
isa = PBXGroup;
children = (
2AC4C0451301D8CB00712FB7 /* dsa_pub.pem */,
2AC4C0461301D8CB00712FB7 /* ExuastWindow.xib */,
2AC4C0481301D8CB00712FB7 /* InfoPlist.strings */,
2AC4C04A1301D8CB00712FB7 /* Localizable.strings */,
2AC4C04C1301D8CB00712FB7 /* MainMenu.xib */,
2AC4C0E41301E2DC00712FB7 /* Exhaust.icns */,
2AC4C0611301D8E000712FB7 /* Info.plist */,
);
path = Resources;
sourceTree = "<group>";
};
2AF65A2B120E048A00DC0A49 /* Classes */ = {
isa = PBXGroup;
children = (
2AF65A2C120E048A00DC0A49 /* MGMController.h */,
2AF65A2D120E048A00DC0A49 /* MGMController.m */,
2A9E36671301B79000F40B5F /* MGMFileManager.h */,
2A9E36681301B79000F40B5F /* MGMFileManager.m */,
2AF65A2E120E048A00DC0A49 /* MGMLoginItems.h */,
2AF65A2F120E048A00DC0A49 /* MGMLoginItems.m */,
2A9E36751301C8CD00F40B5F /* MGMAddons.h */,
2A9E36761301C8D100F40B5F /* MGMAddons.m */,
);
path = Classes;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
8D1107260486CEB800E47090 /* Exhaust */ = {
isa = PBXNativeTarget;
buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Exhaust" */;
buildPhases = (
8D1107290486CEB800E47090 /* Resources */,
8D11072C0486CEB800E47090 /* Sources */,
8D11072E0486CEB800E47090 /* Frameworks */,
2AF65EF8120F65D000DC0A49 /* Frameworks */,
);
buildRules = (
);
dependencies = (
2A9E36661301B73F00F40B5F /* PBXTargetDependency */,
);
name = Exhaust;
productInstallPath = "$(HOME)/Applications";
productName = Exhaust;
productReference = 8D1107320486CEB800E47090 /* Exhaust.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Exhaust" */;
compatibilityVersion = "Xcode 3.1";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
es,
se,
pt_PT,
"pt-PT",
fr,
sv,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* Exhaust */;
projectDirPath = "";
projectRoot = "";
targets = (
8D1107260486CEB800E47090 /* Exhaust */,
2A9E36601301B6F100F40B5F /* Build Directory */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8D1107290486CEB800E47090 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2AC4C05B1301D8CB00712FB7 /* dsa_pub.pem in Resources */,
2AC4C05C1301D8CB00712FB7 /* ExuastWindow.xib in Resources */,
2AC4C05D1301D8CB00712FB7 /* InfoPlist.strings in Resources */,
2AC4C05E1301D8CB00712FB7 /* Localizable.strings in Resources */,
2AC4C05F1301D8CB00712FB7 /* MainMenu.xib in Resources */,
2AC4C0E51301E2DC00712FB7 /* Exhaust.icns in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
2A9E36641301B70D00F40B5F /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [ \"$SRCROOT/build\" != \"$SYMROOT\" ]; then\n\tif [ -d \"$SRCROOT/build\" ]; then\n\t\t/bin/rm -Rf \"$SRCROOT/build\"\n fi\n\t/bin/ln -fs \"$SYMROOT\" \"$SRCROOT/build\"\nfi";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8D11072C0486CEB800E47090 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2AF65A30120E048A00DC0A49 /* MGMController.m in Sources */,
2AF65A31120E048A00DC0A49 /* MGMLoginItems.m in Sources */,
2A9E36691301B79100F40B5F /* MGMFileManager.m in Sources */,
2A9E36771301C8D300F40B5F /* MGMAddons.m in Sources */,
2A9E367E1301CA3D00F40B5F /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
2A9E36661301B73F00F40B5F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 2A9E36601301B6F100F40B5F /* Build Directory */;
targetProxy = 2A9E36651301B73F00F40B5F /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
2AC4C0461301D8CB00712FB7 /* ExuastWindow.xib */ = {
isa = PBXVariantGroup;
children = (
2AC4C0471301D8CB00712FB7 /* English */,
2AC4C04E1301D8CB00712FB7 /* es */,
2AC4C0511301D8CB00712FB7 /* fr */,
2AC4C0551301D8CB00712FB7 /* pt-PT */,
2AC4C0581301D8CB00712FB7 /* sv */,
);
name = ExuastWindow.xib;
sourceTree = "<group>";
};
2AC4C0481301D8CB00712FB7 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
2AC4C0491301D8CB00712FB7 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
2AC4C04A1301D8CB00712FB7 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
2AC4C04B1301D8CB00712FB7 /* English */,
2AC4C04F1301D8CB00712FB7 /* es */,
2AC4C0521301D8CB00712FB7 /* fr */,
2AC4C0561301D8CB00712FB7 /* pt-PT */,
2AC4C0591301D8CB00712FB7 /* sv */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
2AC4C04C1301D8CB00712FB7 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
2AC4C04D1301D8CB00712FB7 /* English */,
2AC4C0501301D8CB00712FB7 /* es */,
2AC4C0531301D8CB00712FB7 /* fr */,
2AC4C0571301D8CB00712FB7 /* pt-PT */,
2AC4C05A1301D8CB00712FB7 /* sv */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
2A9E36621301B6F200F40B5F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
2A9E36631301B6F200F40B5F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
C01FCF4B08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COPY_PHASE_STRIP = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/Frameworks\"",
);
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = Classes/prefix.pch;
INFOPLIST_FILE = Resources/Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
PRODUCT_NAME = Exhaust;
};
name = Debug;
};
C01FCF4C08A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/Frameworks\"",
);
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = Classes/prefix.pch;
INFOPLIST_FILE = Resources/Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
PRODUCT_NAME = Exhaust;
};
name = Release;
};
C01FCF4F08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
x86_64,
);
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_VERSION = 4.2;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.4;
"MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5;
ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
SDKROOT = macosx10.6;
VALID_ARCHS = "ppc i386 x86_64";
};
name = Debug;
};
C01FCF5008A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
x86_64,
);
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_VERSION = 4.2;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.4;
"MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5;
PREBINDING = NO;
SDKROOT = macosx10.6;
VALID_ARCHS = "ppc i386 x86_64";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
2A9E36611301B6F200F40B5F /* Build configuration list for PBXAggregateTarget "Build Directory" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2A9E36621301B6F200F40B5F /* Debug */,
2A9E36631301B6F200F40B5F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Exhaust" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4B08A954540054247B /* Debug */,
C01FCF4C08A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Exhaust" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4F08A954540054247B /* Debug */,
C01FCF5008A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}

7
Exhaust.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Exhaust.xcodeproj">
</FileRef>
</Workspace>

1
Frameworks/GeckoReporter.framework/GeckoReporter

@ -0,0 +1 @@
Versions/Current/GeckoReporter

1
Frameworks/GeckoReporter.framework/Headers

@ -0,0 +1 @@
Versions/Current/Headers

1
Frameworks/GeckoReporter.framework/Resources

@ -0,0 +1 @@
Versions/Current/Resources

BIN
Frameworks/GeckoReporter.framework/Versions/A/GeckoReporter

12
Frameworks/GeckoReporter.framework/Versions/A/Headers/GeckoReporter.h

@ -0,0 +1,12 @@
//
// GeckoReporter.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/27/09.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMReporter.h"
#import "MGMSender.h"
#import "MGMSystemInfo.h"
#import "MGMLog.h"

16
Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMFeedback.h

@ -0,0 +1,16 @@
//
// MGMFeedback.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/2/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@interface MGMFeedback : NSObject {
}
- (IBAction)openBugReport:(id)sender;
- (IBAction)openContact:(id)sender;
@end

12
Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMLog.h

@ -0,0 +1,12 @@
//
// MGMLog.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/1/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
void MGMLog(NSString *format, ...);
void MGMLogv(NSString *format, va_list args);

28
Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMReporter.h

@ -0,0 +1,28 @@
//
// MGMReporter.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/27/09.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
extern NSString * const MGMGRDoneNotification;
extern NSString * const MGMGRUserEmail;
extern NSString * const MGMGRUserName;
extern NSString * const MGMGRLastCrashDate;
extern NSString * const MGMGRSendAll;
extern NSString * const MGMGRIgnoreAll;
#define MGMGRReleaseDebug 0
@class MGMSender;
@interface MGMReporter : NSObject {
BOOL foundReport;
NSDate *lastDate;
MGMSender *mailSender;
}
+ (id)sharedReporter;
@end

20
Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMSender.h

@ -0,0 +1,20 @@
//
// MGMSender.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/28/09.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
#import "MGMSenderDelegate.h"
@interface MGMSender : NSObject {
id<MGMSenderDelegate> delegate;
NSMutableData *receivedData;
NSURLConnection *theConnection;
}
- (void)sendReport:(NSString *)theReportPath reportDate:(NSDate *)theReportDate userReport:(NSString *)theUserReport delegate:(id)theDelegate;
- (void)sendBug:(NSString *)theBug reproduce:(NSString *)theReproduce delegate:(id)theDelegate;
- (void)sendMessage:(NSString *)theMessage subject:(NSString *)theSubject delegate:(id)theDelegate;
@end

15
Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMSenderDelegate.h

@ -0,0 +1,15 @@
//
// MGMSenderDelegate.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/2/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@protocol MGMSenderDelegate <NSObject>
- (void)sendError:(NSError *)error;
- (void)sendFinished:(NSString *)received;
@end

46
Frameworks/GeckoReporter.framework/Versions/A/Headers/MGMSystemInfo.h

@ -0,0 +1,46 @@
//
// MGMSystemInfo.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/31/09.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@interface MGMSystemInfo : NSObject {
}
+ (MGMSystemInfo *)info;
- (NSString *)architecture;
- (BOOL)is64Bit;
- (NSString *)CPUFamily;
- (int)CPUCount;
- (NSString *)model;
- (NSString *)modelName;
- (int)CPUMHz;
- (int)RAMSize;
- (int)OSMajorVersion;
- (int)OSMinorVersion;
- (int)OSBugFixVersion;
- (NSString *)OSVersion;
- (NSString *)OSVersionName;
- (BOOL)isAfterCheetah;
- (BOOL)isAfterPuma;
- (BOOL)isAfterJaguar;
- (BOOL)isAfterPanther;
- (BOOL)isAfterTiger;
- (BOOL)isAfterLeopard;
- (BOOL)isAfterSnowLeopard;
- (NSString *)language;
- (NSString *)applicationIdentifier;
- (NSString *)applicationName;
- (NSString *)applicationEXECName;
- (NSString *)applicationVersion;
- (BOOL)isUIElement;
- (NSBundle *)frameworkBundle;
- (NSString *)frameworkVersion;
- (NSString *)useragentWithApplicationNameAndVersion:(NSString *)nameAndVersion;
- (NSString *)useragent;
@end

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/GeckoReporter.strings

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMBugWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMContactWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMReportWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/GeckoReporter.strings

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMBugWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMContactWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMReportWindow.nib

42
Frameworks/GeckoReporter.framework/Versions/A/Resources/Info.plist

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>10J567</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>GeckoReporter</string>
<key>CFBundleIdentifier</key>
<string>com.MrGeckosMedia.GeckoReporter</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>GeckoReporter</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>0.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.2</string>
<key>DTCompiler</key>
<string>4.2</string>
<key>DTPlatformBuild</key>
<string>4A278b</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>4A278b</string>
<key>DTSDKName</key>
<string>macosx10.6</string>
<key>DTXcode</key>
<string>0400</string>
<key>DTXcodeBuild</key>
<string>4A278b</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/</string>
</dict>
</plist>

27
Frameworks/GeckoReporter.framework/Versions/A/Resources/License.txt

@ -0,0 +1,27 @@
Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
Permission is granted, to any person obtaining a copy of this framework, to
use, copy, modify, merge, or redistribute this framework under the following terms:
1. This file must be included in all copies of this framework unmodified in
GeckoReporter.framework/Resource/License.txt and/or GeckoReporter.framework/Versions/A/Resources/License.txt.
2. THIS FRAMEWORK IS PROVIDED "AS IS" BY JAMES COLEMAN, WITHOUT WARRANTY OF
ANY KIND. IF YOUR SOFTWARE/FRAMEWORK/COMPUTER CRASH OR FAILS TO WORK IN ANY
WAY SHAPE OR FORM BECAUSE OF THIS FRAMEWORK, I (JAMES COLEMAN) AM NOT IN ANYWAY
RESPONSIBLE FOR YOUR PROBLEM. BUT, I MAY BE WILLING TO HELP YOU, NO PROMISES.
3. Redistributions of source code included in this framework must retain the
copyright notice above this license file without modifications.
4. Redistributions of binary must contain the copyright above this license file
without modifications.
5. If you use the crash reporter in this framework, you are allowed to remove the
NSTextField that says, "GeckoReporter by Mr. Gecko's Media".
6. For the users convenience, you must retain the notice about anonymous system
information being sent.
7. Mr. Gecko's Media (James Coleman) is allowed to modify these terms without notice to you
or your customers.

206
Frameworks/GeckoReporter.framework/Versions/A/Resources/ModelNames.plist

@ -0,0 +1,206 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ADP2,1</key>
<string>Developer Transition Kit</string>
<key>iMac1,1</key>
<string>iMac G3 (Rev A-D)</string>
<key>PowerMac2,1</key>
<string>iMac G3 (Slot-loading CD-ROM)</string>
<key>PowerMac2,2</key>
<string>iMac G3 (Summer 2000)</string>
<key>PowerMac4,1</key>
<string>iMac G3 (2001)</string>
<key>PowerMac4,2</key>
<string>iMac G4 (Flat Panel)</string>
<key>PowerMac4,5</key>
<string>iMac G4 (17&quot; Flat Panel)</string>
<key>PowerMac6,1</key>
<string>iMac G4 (USB 2.0)</string>
<key>PowerMac6,3</key>
<string>iMac G4 (20&quot; Flat Panel)</string>
<key>PowerMac8,1</key>
<string>iMac G5</string>
<key>PowerMac8,2</key>
<string>iMac G5 (Ambient Light Sensor)</string>
<key>PowerMac12,1</key>
<string>iMac G5 (iSight)</string>
<key>iMac4,1</key>
<string>iMac (Core Duo)</string>
<key>iMac4,2</key>
<string>iMac for Education (17&quot; Core Duo)</string>
<key>iMac5,1</key>
<string>iMac (Core 2 Duo 17&quot;/20&quot; SuperDrive)</string>
<key>iMac5,2</key>
<string>iMac (Core 2 Duo 17&quot; Combo Drive)</string>
<key>iMac6,1</key>
<string>iMac (Core 2 Duo 24&quot; SuperDrive)</string>
<key>iMac7,1</key>
<string>iMac (AI)</string>
<key>iMac8,1</key>
<string>iMac (2008)</string>
<key>iMac9,1</key>
<string>iMac (2009)</string>
<key>iMac10,1</key>
<string>iMac (2009 Magic)</string>
<key>iMac11,1</key>
<string>iMac (2009 Core I5)</string>
<key>PowerMac4,4</key>
<string>eMac</string>
<key>PowerMac6,4</key>
<string>eMac (USB 2.0 2005)</string>
<key>PowerMac10,1</key>
<string>Mac Mini G4</string>
<key>PowerMac10,2</key>
<string>Mac Mini (2005)</string>
<key>Macmini1,1</key>
<string>Mac Mini (Core Solo/Duo)</string>
<key>Macmini2,1</key>
<string>Mac Mini (Core 2 Duo)</string>
<key>Macmini3,1</key>
<string>Mac Mini (2009)</string>
<key>PowerBook2,1</key>
<string>iBook G3</string>
<key>PowerBook2,2</key>
<string>iBook G3 (FireWire)</string>
<key>PowerBook2,3</key>
<string>iBook G3</string>
<key>PowerBook2,4</key>
<string>iBook G3</string>
<key>PowerBook4,1</key>
<string>iBook G3 (Dual USB 2001)</string>
<key>PowerBook4,2</key>
<string>iBook G3 (16MB VRAM)</string>
<key>PowerBook4,3</key>
<string>iBook G3 Opaque 16MB VRAM/32MB VRAM 2003)</string>
<key>PowerBook6,3</key>
<string>iBook G4</string>
<key>PowerBook6,5</key>
<string>iBook G4 (2004)</string>
<key>PowerBook6,7</key>
<string>iBook G4 (Mid 2005)</string>
<key>PowerBook1,1</key>
<string>PowerBook G3</string>
<key>PowerBook3,1</key>
<string>PowerBook G3 (FireWire)</string>
<key>PowerBook3,2</key>
<string>PowerBook G4</string>
<key>PowerBook3,3</key>
<string>PowerBook G4 (Gigabit Ethernet)</string>
<key>PowerBook3,4</key>
<string>PowerBook G4 (DVI)</string>
<key>PowerBook3,5</key>
<string>PowerBook G4 (1GHz/867MHz)</string>
<key>PowerBook5,1</key>
<string>PowerBook G4 (17&quot;)</string>
<key>PowerBook5,2</key>
<string>PowerBook G4 (15&quot; FW 800)</string>
<key>PowerBook5,3</key>
<string>PowerBook G4 (17&quot; 1.33GHz)</string>
<key>PowerBook5,4</key>
<string>PowerBook G4 (15&quot; 1.5/1.33GHz)</string>
<key>PowerBook5,5</key>
<string>PowerBook G4 (17&quot; 1.5GHz)</string>
<key>PowerBook5,6</key>
<string>PowerBook G4 (15&quot; 1.67GHz/1.5GHz)</string>
<key>PowerBook5,7</key>
<string>PowerBook G4 (17&quot; 1.67GHz)</string>
<key>PowerBook5,8</key>
<string>PowerBook G4 (Double layer SD 15&quot;)</string>
<key>PowerBook5,9</key>
<string>PowerBook G4 (Double layer SD 17&quot;)</string>
<key>PowerBook6,1</key>
<string>PowerBook G4 (12&quot;)</string>
<key>PowerBook6,2</key>
<string>PowerBook G4 (12&quot; DVI)</string>
<key>PowerBook6,4</key>
<string>PowerBook G4 (12&quot; 1.33GHz)</string>
<key>PowerBook6,8</key>
<string>PowerBook G4 (12&quot; 1.5GHz)</string>
<key>MacBook1,1</key>
<string>MacBook (Core Duo)</string>
<key>MacBook2,1</key>
<string>MacBook (Core 2 Duo)</string>
<key>MacBook4,1</key>
<string>MacBook (2008)</string>
<key>MacBook5,1</key>
<string>MacBook (Unibody)</string>
<key>MacBook5,2</key>
<string>MacBook (White 2009)</string>
<key>MacBook6,1</key>
<string>MacBook (White Unibody)</string>
<key>MacBookAir1,1</key>
<string>MacBook Air (2008)</string>
<key>MacBookPro1,1</key>
<string>MacBook Pro Core Duo (15&quot;)</string>
<key>MacBookPro1,2</key>
<string>MacBook Pro Core Duo (17&quot;)</string>
<key>MacBookPro2,1</key>
<string>MacBook Pro Core 2 Duo (17&quot;)</string>
<key>MacBookPro2,2</key>
<string>MacBook Pro Core 2 Duo (15&quot;)</string>
<key>MacBookPro3,1</key>
<string>MacBook Pro Core 2 Duo (15&quot; LED Core 2 Duo)</string>
<key>MacBookPro3,2</key>
<string>MacBook Pro Core 2 Duo (17&quot; HD Core 2 Duo)</string>
<key>MacBookPro4,1</key>
<string>MacBook Pro (Core 2 Duo 2008)</string>
<key>MacBookPro5,1</key>
<string>MacBook Pro (Unibody)</string>
<key>MacBookPro5,2</key>
<string>MacBook Pro (Unibody 17&quot; 2009)</string>
<key>MacBookPro5,3</key>
<string>MacBook Pro (Unibody 15&quot; 2009)</string>
<key>MacBookPro5,4</key>
<string>MacBook Pro (Unibody 15&quot; 2009)</string>
<key>MacBookPro5,5</key>
<string>MacBook Pro (Unibody 13&quot; 2009)</string>
<key>PowerMac1,1</key>
<string>Power Macintosh G3 (Blue &amp; White)</string>
<key>PowerMac1,2</key>
<string>Power Macintosh G4 (PCI Graphics)</string>
<key>PowerMac11,2</key>
<string>Power Macintosh G5 (2005)</string>
<key>PowerMac3,1</key>
<string>Power Macintosh G4 (AGP Graphics)</string>
<key>PowerMac3,2</key>
<string>Power Macintosh G4 (AGP Graphics)</string>
<key>PowerMac3,3</key>
<string>Power Macintosh G4 (Gigabit Ethernet)</string>
<key>PowerMac3,4</key>
<string>Power Macintosh G4 (Digital Audio)</string>
<key>PowerMac3,5</key>
<string>Power Macintosh G4 (Quick Silver)</string>
<key>PowerMac3,6</key>
<string>Power Macintosh G4 (Mirrored Drive Door)</string>
<key>PowerMac5,1</key>
<string>Power Macintosh G4 Cube</string>
<key>PowerMac7,2</key>
<string>Power Macintosh G5</string>
<key>PowerMac7,3</key>
<string>Power Macintosh G5</string>
<key>PowerMac9,1</key>
<string>Power Macintosh G5 (2005)</string>
<key>MacPro1,1</key>
<string>Mac Pro (Four-Core)</string>
<key>MacPro2,1</key>
<string>Mac Pro (Eight-Core)</string>
<key>MacPro3,1</key>
<string>Mac Pro (2008 4/8 core &quot;Harpertown&quot;)</string>
<key>MacPro4,1</key>
<string>Mac Pro (2009 &quot;Nehalem&quot;)</string>
<key>RackMac1,1</key>
<string>Xserve G4</string>
<key>RackMac1,2</key>
<string>Xserve G4 (Slot-loading cluster node)</string>
<key>RackMac3,1</key>
<string>Xserve G5</string>
<key>Xserve1,1</key>
<string>Xserve (Intel Xeon)</string>
<key>Xserve2,1</key>
<string>Xserve (2008 Quad-Core)</string>
<key>Xserve3,1</key>
<string>Xserve (2009 Quad-Core)</string>
</dict>
</plist>

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/GeckoReporter.strings

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMBugWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMContactWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMReportWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/GeckoReporter.strings

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMBugWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMContactWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMReportWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/GeckoReporter.strings

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMBugWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMContactWindow.nib

BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMReportWindow.nib

1
Frameworks/GeckoReporter.framework/Versions/Current

@ -0,0 +1 @@
A

1
Frameworks/Sparkle.framework/Headers

@ -0,0 +1 @@
Versions/Current/Headers

1
Frameworks/Sparkle.framework/Resources

@ -0,0 +1 @@
Versions/Current/Resources

1
Frameworks/Sparkle.framework/Sparkle

@ -0,0 +1 @@
Versions/Current/Sparkle

36
Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h

@ -0,0 +1,36 @@
//
// SUAppcast.h
// Sparkle
//
// Created by Andy Matuschak on 3/12/06.
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SUAPPCAST_H
#define SUAPPCAST_H
@class SUAppcastItem;
@interface SUAppcast : NSObject
{
@private
NSArray *items;
NSString *userAgentString;
id delegate;
NSString *downloadFilename;
NSURLDownload *download;
}
- (void)fetchAppcastFromURL:(NSURL *)url;
- (void)setDelegate:delegate;
- (void)setUserAgentString:(NSString *)userAgentString;
- (NSArray *)items;
@end
@interface NSObject (SUAppcastDelegate)
- (void)appcastDidFinishLoading:(SUAppcast *)appcast;
- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error;
@end
#endif

54
Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h

@ -0,0 +1,54 @@
//
// SUAppcastItem.h
// Sparkle
//
// Created by Andy Matuschak on 3/12/06.
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SUAPPCASTITEM_H
#define SUAPPCASTITEM_H
@interface SUAppcastItem : NSObject
{
@private
NSString *title;
NSDate *date;
NSString *itemDescription;
NSURL *releaseNotesURL;
NSString *DSASignature;
NSString *minimumSystemVersion;
NSURL *fileURL;
NSString *versionString;
NSString *displayVersionString;
NSDictionary *deltaUpdates;
NSDictionary *propertiesDictionary;
}
// Initializes with data from a dictionary provided by the RSS class.
- initWithDictionary:(NSDictionary *)dict;
- initWithDictionary:(NSDictionary *)dict failureReason:(NSString**)error;
- (NSString *)title;
- (NSString *)versionString;
- (NSString *)displayVersionString;
- (NSDate *)date;
- (NSString *)itemDescription;
- (NSURL *)releaseNotesURL;
- (NSURL *)fileURL;
- (NSString *)DSASignature;
- (NSString *)minimumSystemVersion;
- (NSDictionary *)deltaUpdates;
- (BOOL)isDeltaUpdate;
// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.
- (NSDictionary *)propertiesDictionary;
@end
#endif

126
Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h

@ -0,0 +1,126 @@
//
// SUUpdater.h
// Sparkle
//
// Created by Andy Matuschak on 1/4/06.
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SUUPDATER_H
#define SUUPDATER_H
#import <Sparkle/SUVersionComparisonProtocol.h>
@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;
@interface SUUpdater : NSObject
{
@private
NSTimer *checkTimer;
SUUpdateDriver *driver;
NSString *customUserAgentString;
SUHost *host;
IBOutlet id delegate;
}
+ (SUUpdater *)sharedUpdater;
+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;
- initForBundle:(NSBundle *)bundle;
- (NSBundle *)hostBundle;
- (void)setDelegate:(id)delegate;
- delegate;
- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks;
- (BOOL)automaticallyChecksForUpdates;
- (void)setUpdateCheckInterval:(NSTimeInterval)interval;
- (NSTimeInterval)updateCheckInterval;
- (void)setFeedURL:(NSURL *)feedURL;
- (NSURL *)feedURL;
- (void)setUserAgentString:(NSString *)userAgent;
- (NSString *)userAgentString;
- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile;
- (BOOL)sendsSystemProfile;
- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates;
- (BOOL)automaticallyDownloadsUpdates;
// This IBAction is meant for a main menu item. Hook up any menu item to this action,
// and Sparkle will check for updates and report back its findings verbosely.
- (IBAction)checkForUpdates:sender;
// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update,
// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an
// update is found, it will be downloaded and prepped for installation.
- (void)checkForUpdatesInBackground;
// Date of last update check. Returns null if no check has been performed.
- (NSDate*)lastUpdateCheckDate;
// This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though,
// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI.
- (void)checkForUpdateInformation;
// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer.
- (void)resetUpdateCycle;
- (BOOL)updateInProgress;
@end
@interface NSObject (SUUpdaterDelegateInformalProtocol)
// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user.
- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;
// Use this to override the default behavior for Sparkle prompting the user about automatic update checks.
- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle;
// Implement this if you want to do some special handling with the appcast once it finishes loading.
- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;
// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding
// a valid update, if any, in the given appcast.
- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle;
// Sent when a valid update is found by the update driver.
- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;
// Sent when a valid update is not found.
- (void)updaterDidNotFindUpdate:(SUUpdater *)update;
// Sent immediately before installing the specified update.
- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update;
// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue.
- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;
// Called immediately before relaunching.
- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;
// This method allows you to provide a custom version comparator.
// If you don't implement this method or return nil, the standard version comparator will be used.
- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;
// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle.
- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;
@end
// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds.
#ifdef DEBUG
#define SU_MIN_CHECK_INTERVAL 60
#else
#define SU_MIN_CHECK_INTERVAL 60*60
#endif
#ifdef DEBUG
#define SU_DEFAULT_CHECK_INTERVAL 60
#else
#define SU_DEFAULT_CHECK_INTERVAL 60*60*24
#endif
#endif

27
Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h

@ -0,0 +1,27 @@
//
// SUVersionComparisonProtocol.h
// Sparkle
//
// Created by Andy Matuschak on 12/21/07.
// Copyright 2007 Andy Matuschak. All rights reserved.
//
#ifndef SUVERSIONCOMPARISONPROTOCOL_H
#define SUVERSIONCOMPARISONPROTOCOL_H
/*!
@protocol
@abstract Implement this protocol to provide version comparison facilities for Sparkle.
*/
@protocol SUVersionComparison
/*!
@method
@abstract An abstract method to compare two version strings.
@discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.
*/
- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB;
@end
#endif

21
Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h

@ -0,0 +1,21 @@
//
// Sparkle.h
// Sparkle
//
// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SPARKLE_H
#define SPARKLE_H
// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless
// there are name-space collisions) so we can list all of them to start with:
#import <Sparkle/SUUpdater.h>
#import <Sparkle/SUAppcast.h>
#import <Sparkle/SUAppcastItem.h>
#import <Sparkle/SUVersionComparisonProtocol.h>
#endif

24
Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>Sparkle</string>
<key>CFBundleIdentifier</key>
<string>org.andymatuschak.Sparkle</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Sparkle</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.5 Beta (git)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>7baf505</string>
</dict>
</plist>

153
Frameworks/Sparkle.framework/Versions/A/Resources/License.txt

@ -0,0 +1,153 @@
Copyright (c) 2006 Andy Matuschak
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
=================
EXTERNAL LICENSES
=================
This project uses software developed by the OpenSSL Project for use in the OpenSSL
Toolkit (http://www.openssl.org). This toolkit is licensed as follows:
/* ====================================================================
* Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modiÞcation, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* ÒThis product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)Ó
*
* 4. The names ÒOpenSSL ToolkitÓ and ÒOpenSSL ProjectÓ must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called ÒOpenSSLÓ
* nor may ÒOpenSSLÓ appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* ÒThis product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)Ó
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS ISÕÕ AND ANY
* EXPRESSED 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 OpenSSL PROJECT OR
* ITS 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.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
Original SSLeay License
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
*
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
*
* Copyright remains Eric YoungÕs, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
*
* Redistribution and use in source and binary forms, with or without
* modiÞcation, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* ÒThis product includes cryptographic software written by
* Eric Young (eay@cryptsoft.com)Ó
* The word ÔcryptographicÕ can be left out if the rouines from the library
* being used are not cryptographic related :-).
* 4. If you include any Windows speciÞc code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* ÒThis product includes software written by Tim Hudson (tjh@cryptsoft.com)Ó
*
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
*
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
* [including the GNU Public Licence.]
*/
License for bspatch.c and bsdiff.c, from bsdiff 4.3 (<http://www.daemonology.net/bsdiff/>:
/*-
* Copyright 2003-2005 Colin Percival
* All rights reserved
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted providing that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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 AUTHOR ``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 AUTHOR 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.
*/

174
Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ADP2,1</key>
<string>Developer Transition Kit</string>
<key>MacBook1,1</key>
<string>MacBook (Core Duo)</string>
<key>MacBook2,1</key>
<string>MacBook (Core 2 Duo)</string>
<key>MacBook4,1</key>
<string>MacBook (Core 2 Duo Feb 2008)</string>
<key>MacBookAir1,1</key>
<string>MacBook Air (January 2008)</string>
<key>MacBookPro1,1</key>
<string>MacBook Pro Core Duo (15-inch)</string>
<key>MacBookPro1,2</key>
<string>MacBook Pro Core Duo (17-inch)</string>
<key>MacBookPro2,1</key>
<string>MacBook Pro Core 2 Duo (17-inch)</string>
<key>MacBookPro2,2</key>
<string>MacBook Pro Core 2 Duo (15-inch)</string>
<key>MacBookPro3,1</key>
<string>MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo)</string>
<key>MacBookPro3,2</key>
<string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>
<key>MacBookPro4,1</key>
<string>MacBook Pro (Core 2 Duo Feb 2008)</string>
<key>MacPro1,1</key>
<string>Mac Pro (four-core)</string>
<key>MacPro2,1</key>
<string>Mac Pro (eight-core)</string>
<key>MacPro3,1</key>
<string>Mac Pro (January 2008 4- or 8- core "Harpertown")</string>
<key>Macmini1,1</key>
<string>Mac Mini (Core Solo/Duo)</string>
<key>PowerBook1,1</key>
<string>PowerBook G3</string>
<key>PowerBook2,1</key>
<string>iBook G3</string>
<key>PowerBook2,2</key>
<string>iBook G3 (FireWire)</string>
<key>PowerBook2,3</key>
<string>iBook G3</string>
<key>PowerBook2,4</key>
<string>iBook G3</string>
<key>PowerBook3,1</key>
<string>PowerBook G3 (FireWire)</string>
<key>PowerBook3,2</key>
<string>PowerBook G4</string>
<key>PowerBook3,3</key>
<string>PowerBook G4 (Gigabit Ethernet)</string>
<key>PowerBook3,4</key>
<string>PowerBook G4 (DVI)</string>
<key>PowerBook3,5</key>
<string>PowerBook G4 (1GHz / 867MHz)</string>
<key>PowerBook4,1</key>
<string>iBook G3 (Dual USB, Late 2001)</string>
<key>PowerBook4,2</key>
<string>iBook G3 (16MB VRAM)</string>
<key>PowerBook4,3</key>
<string>iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003)</string>
<key>PowerBook5,1</key>
<string>PowerBook G4 (17 inch)</string>
<key>PowerBook5,2</key>
<string>PowerBook G4 (15 inch FW 800)</string>
<key>PowerBook5,3</key>
<string>PowerBook G4 (17-inch 1.33GHz)</string>
<key>PowerBook5,4</key>
<string>PowerBook G4 (15 inch 1.5/1.33GHz)</string>
<key>PowerBook5,5</key>
<string>PowerBook G4 (17-inch 1.5GHz)</string>
<key>PowerBook5,6</key>
<string>PowerBook G4 (15 inch 1.67GHz/1.5GHz)</string>
<key>PowerBook5,7</key>
<string>PowerBook G4 (17-inch 1.67GHz)</string>
<key>PowerBook5,8</key>
<string>PowerBook G4 (Double layer SD, 15 inch)</string>
<key>PowerBook5,9</key>
<string>PowerBook G4 (Double layer SD, 17 inch)</string>
<key>PowerBook6,1</key>
<string>PowerBook G4 (12 inch)</string>
<key>PowerBook6,2</key>
<string>PowerBook G4 (12 inch, DVI)</string>
<key>PowerBook6,3</key>
<string>iBook G4</string>
<key>PowerBook6,4</key>
<string>PowerBook G4 (12 inch 1.33GHz)</string>
<key>PowerBook6,5</key>
<string>iBook G4 (Early-Late 2004)</string>
<key>PowerBook6,7</key>
<string>iBook G4 (Mid 2005)</string>
<key>PowerBook6,8</key>
<string>PowerBook G4 (12 inch 1.5GHz)</string>
<key>PowerMac1,1</key>
<string>Power Macintosh G3 (Blue &amp; White)</string>
<key>PowerMac1,2</key>
<string>Power Macintosh G4 (PCI Graphics)</string>
<key>PowerMac10,1</key>
<string>Mac Mini G4</string>
<key>PowerMac10,2</key>
<string>Mac Mini (Late 2005)</string>
<key>PowerMac11,2</key>
<string>Power Macintosh G5 (Late 2005)</string>
<key>PowerMac12,1</key>
<string>iMac G5 (iSight)</string>
<key>PowerMac2,1</key>
<string>iMac G3 (Slot-loading CD-ROM)</string>
<key>PowerMac2,2</key>
<string>iMac G3 (Summer 2000)</string>
<key>PowerMac3,1</key>
<string>Power Macintosh G4 (AGP Graphics)</string>
<key>PowerMac3,2</key>
<string>Power Macintosh G4 (AGP Graphics)</string>
<key>PowerMac3,3</key>
<string>Power Macintosh G4 (Gigabit Ethernet)</string>
<key>PowerMac3,4</key>
<string>Power Macintosh G4 (Digital Audio)</string>
<key>PowerMac3,5</key>
<string>Power Macintosh G4 (Quick Silver)</string>
<key>PowerMac3,6</key>
<string>Power Macintosh G4 (Mirrored Drive Door)</string>
<key>PowerMac4,1</key>
<string>iMac G3 (Early/Summer 2001)</string>
<key>PowerMac4,2</key>
<string>iMac G4 (Flat Panel)</string>
<key>PowerMac4,4</key>
<string>eMac</string>
<key>PowerMac4,5</key>
<string>iMac G4 (17-inch Flat Panel)</string>
<key>PowerMac5,1</key>
<string>Power Macintosh G4 Cube</string>
<key>PowerMac6,1</key>
<string>iMac G4 (USB 2.0)</string>
<key>PowerMac6,3</key>
<string>iMac G4 (20-inch Flat Panel)</string>
<key>PowerMac6,4</key>
<string>eMac (USB 2.0, 2005)</string>
<key>PowerMac7,2</key>
<string>Power Macintosh G5</string>
<key>PowerMac7,3</key>
<string>Power Macintosh G5</string>
<key>PowerMac8,1</key>
<string>iMac G5</string>
<key>PowerMac8,2</key>
<string>iMac G5 (Ambient Light Sensor)</string>
<key>PowerMac9,1</key>
<string>Power Macintosh G5 (Late 2005)</string>
<key>RackMac1,1</key>
<string>Xserve G4</string>
<key>RackMac1,2</key>
<string>Xserve G4 (slot-loading, cluster node)</string>
<key>RackMac3,1</key>
<string>Xserve G5</string>
<key>Xserve1,1</key>
<string>Xserve (Intel Xeon)</string>
<key>Xserve2,1</key>
<string>Xserve (January 2008 quad-core)</string>
<key>iMac1,1</key>
<string>iMac G3 (Rev A-D)</string>
<key>iMac4,1</key>
<string>iMac (Core Duo)</string>
<key>iMac4,2</key>
<string>iMac for Education (17-inch, Core Duo)</string>
<key>iMac5,1</key>
<string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>
<key>iMac5,2</key>
<string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>
<key>iMac6,1</key>
<string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>
<key>iMac8,1</key>
<string>iMac (April 2008)</string>
</dict>
</plist>

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings

1
Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj

@ -0,0 +1 @@
fr.lproj

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save