Exhaust Start
This commit is contained in:
commit
89c1462a05
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -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
Normal file
14
Classes/MGMAddons.h
Normal file
@ -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
Normal file
78
Classes/MGMAddons.m
Normal file
@ -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
Normal file
74
Classes/MGMController.h
Normal file
@ -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
Normal file
720
Classes/MGMController.m
Normal file
@ -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
Normal file
23
Classes/MGMFileManager.h
Normal file
@ -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
Normal file
86
Classes/MGMFileManager.m
Normal file
@ -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
Normal file
26
Classes/MGMLoginItems.h
Normal file
@ -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
Normal file
89
Classes/MGMLoginItems.m
Normal file
@ -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
Normal file
14
Classes/main.m
Normal file
@ -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
Normal file
13
Classes/prefix.pch
Normal file
@ -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
Normal file
6
Contributing.txt
Normal file
@ -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
Normal file
BIN
Documentation.pages
Normal file
Binary file not shown.
1652
Exhaust.ai
Normal file
1652
Exhaust.ai
Normal file
File diff suppressed because one or more lines are too long
BIN
Exhaust.icns
Normal file
BIN
Exhaust.icns
Normal file
Binary file not shown.
BIN
Exhaust.png
Normal file
BIN
Exhaust.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
500
Exhaust.xcodeproj/project.pbxproj
Normal file
500
Exhaust.xcodeproj/project.pbxproj
Normal file
@ -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
generated
Normal file
7
Exhaust.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -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
Symbolic link
1
Frameworks/GeckoReporter.framework/GeckoReporter
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
Versions/Current/GeckoReporter
|
1
Frameworks/GeckoReporter.framework/Headers
Symbolic link
1
Frameworks/GeckoReporter.framework/Headers
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
Versions/Current/Headers
|
1
Frameworks/GeckoReporter.framework/Resources
Symbolic link
1
Frameworks/GeckoReporter.framework/Resources
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
Versions/Current/Resources
|
BIN
Frameworks/GeckoReporter.framework/Versions/A/GeckoReporter
Executable file
BIN
Frameworks/GeckoReporter.framework/Versions/A/GeckoReporter
Executable file
Binary file not shown.
@ -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"
|
@ -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
|
@ -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);
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMBugWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMBugWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMContactWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMContactWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMReportWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/English.lproj/MGMReportWindow.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMBugWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMBugWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMContactWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMContactWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMReportWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/French.lproj/MGMReportWindow.nib
generated
Normal file
Binary file not shown.
@ -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>
|
@ -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.
|
@ -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" Flat Panel)</string>
|
||||||
|
<key>PowerMac6,1</key>
|
||||||
|
<string>iMac G4 (USB 2.0)</string>
|
||||||
|
<key>PowerMac6,3</key>
|
||||||
|
<string>iMac G4 (20" 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" Core Duo)</string>
|
||||||
|
<key>iMac5,1</key>
|
||||||
|
<string>iMac (Core 2 Duo 17"/20" SuperDrive)</string>
|
||||||
|
<key>iMac5,2</key>
|
||||||
|
<string>iMac (Core 2 Duo 17" Combo Drive)</string>
|
||||||
|
<key>iMac6,1</key>
|
||||||
|
<string>iMac (Core 2 Duo 24" 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")</string>
|
||||||
|
<key>PowerBook5,2</key>
|
||||||
|
<string>PowerBook G4 (15" FW 800)</string>
|
||||||
|
<key>PowerBook5,3</key>
|
||||||
|
<string>PowerBook G4 (17" 1.33GHz)</string>
|
||||||
|
<key>PowerBook5,4</key>
|
||||||
|
<string>PowerBook G4 (15" 1.5/1.33GHz)</string>
|
||||||
|
<key>PowerBook5,5</key>
|
||||||
|
<string>PowerBook G4 (17" 1.5GHz)</string>
|
||||||
|
<key>PowerBook5,6</key>
|
||||||
|
<string>PowerBook G4 (15" 1.67GHz/1.5GHz)</string>
|
||||||
|
<key>PowerBook5,7</key>
|
||||||
|
<string>PowerBook G4 (17" 1.67GHz)</string>
|
||||||
|
<key>PowerBook5,8</key>
|
||||||
|
<string>PowerBook G4 (Double layer SD 15")</string>
|
||||||
|
<key>PowerBook5,9</key>
|
||||||
|
<string>PowerBook G4 (Double layer SD 17")</string>
|
||||||
|
<key>PowerBook6,1</key>
|
||||||
|
<string>PowerBook G4 (12")</string>
|
||||||
|
<key>PowerBook6,2</key>
|
||||||
|
<string>PowerBook G4 (12" DVI)</string>
|
||||||
|
<key>PowerBook6,4</key>
|
||||||
|
<string>PowerBook G4 (12" 1.33GHz)</string>
|
||||||
|
<key>PowerBook6,8</key>
|
||||||
|
<string>PowerBook G4 (12" 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")</string>
|
||||||
|
<key>MacBookPro1,2</key>
|
||||||
|
<string>MacBook Pro Core Duo (17")</string>
|
||||||
|
<key>MacBookPro2,1</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (17")</string>
|
||||||
|
<key>MacBookPro2,2</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (15")</string>
|
||||||
|
<key>MacBookPro3,1</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (15" LED Core 2 Duo)</string>
|
||||||
|
<key>MacBookPro3,2</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (17" 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" 2009)</string>
|
||||||
|
<key>MacBookPro5,3</key>
|
||||||
|
<string>MacBook Pro (Unibody 15" 2009)</string>
|
||||||
|
<key>MacBookPro5,4</key>
|
||||||
|
<string>MacBook Pro (Unibody 15" 2009)</string>
|
||||||
|
<key>MacBookPro5,5</key>
|
||||||
|
<string>MacBook Pro (Unibody 13" 2009)</string>
|
||||||
|
<key>PowerMac1,1</key>
|
||||||
|
<string>Power Macintosh G3 (Blue & 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 "Harpertown")</string>
|
||||||
|
<key>MacPro4,1</key>
|
||||||
|
<string>Mac Pro (2009 "Nehalem")</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>
|
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMBugWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMBugWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMContactWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMContactWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMReportWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/es.lproj/MGMReportWindow.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMBugWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMBugWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMContactWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMContactWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMReportWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/pt-PT.lproj/MGMReportWindow.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMBugWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMBugWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMContactWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMContactWindow.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMReportWindow.nib
generated
Normal file
BIN
Frameworks/GeckoReporter.framework/Versions/A/Resources/sv.lproj/MGMReportWindow.nib
generated
Normal file
Binary file not shown.
1
Frameworks/GeckoReporter.framework/Versions/Current
Symbolic link
1
Frameworks/GeckoReporter.framework/Versions/Current
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
A
|
1
Frameworks/Sparkle.framework/Headers
Symbolic link
1
Frameworks/Sparkle.framework/Headers
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
Versions/Current/Headers
|
1
Frameworks/Sparkle.framework/Resources
Symbolic link
1
Frameworks/Sparkle.framework/Resources
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
Versions/Current/Resources
|
1
Frameworks/Sparkle.framework/Sparkle
Symbolic link
1
Frameworks/Sparkle.framework/Sparkle
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
Versions/Current/Sparkle
|
36
Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h
Normal file
36
Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h
Normal file
@ -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
|
@ -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
Normal file
126
Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h
Normal file
@ -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
|
@ -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
Normal file
21
Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h
Normal file
@ -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
Normal file
24
Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist
Normal file
@ -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
Normal file
153
Frameworks/Sparkle.framework/Versions/A/Resources/License.txt
Normal file
@ -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.
|
||||||
|
*/
|
@ -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 & 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
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
1
Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
Symbolic link
1
Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
fr.lproj
|
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user