Browse Source

GeckoReporter Start

master
GRMrGecko 14 years ago
commit
3002113549
  1. 12
      Classes/Framework/GeckoReporter.h
  2. 26
      Classes/Framework/MGMBugWindow.h
  3. 83
      Classes/Framework/MGMBugWindow.m
  4. 27
      Classes/Framework/MGMContactWindow.h
  5. 95
      Classes/Framework/MGMContactWindow.m
  6. 16
      Classes/Framework/MGMFeedback.h
  7. 20
      Classes/Framework/MGMFeedback.m
  8. 11
      Classes/Framework/MGMLocalized.h
  9. 12
      Classes/Framework/MGMLog.h
  10. 92
      Classes/Framework/MGMLog.m
  11. 42
      Classes/Framework/MGMReportWindow.h
  12. 136
      Classes/Framework/MGMReportWindow.m
  13. 28
      Classes/Framework/MGMReporter.h
  14. 113
      Classes/Framework/MGMReporter.m
  15. 20
      Classes/Framework/MGMSender.h
  16. 391
      Classes/Framework/MGMSender.m
  17. 15
      Classes/Framework/MGMSenderDelegate.h
  18. 37
      Classes/Framework/MGMSystemInfo.h
  19. 255
      Classes/Framework/MGMSystemInfo.m
  20. 19
      Classes/Test/MGMController.h
  21. 32
      Classes/Test/MGMController.m
  22. 50
      GeckoReporter Test-Info.plist
  23. 30
      GeckoReporter-Info.plist
  24. 7376
      GeckoReporter.ai
  25. BIN
      GeckoReporter.icns
  26. 601
      GeckoReporter.xcodeproj/grmrgecko.pbxuser
  27. 1603
      GeckoReporter.xcodeproj/grmrgecko.perspectivev3
  28. 654
      GeckoReporter.xcodeproj/project.pbxproj
  29. 22
      License.txt
  30. 13
      Prefix.pch
  31. 15
      ReadMe.txt
  32. BIN
      Resources/Framework/English.lproj/GeckoReporter.strings
  33. 1414
      Resources/Framework/English.lproj/MGMBugWindow.xib
  34. 1442
      Resources/Framework/English.lproj/MGMContactWindow.xib
  35. 2846
      Resources/Framework/English.lproj/MGMReportWindow.xib
  36. 206
      Resources/Framework/ModelNames.plist
  37. BIN
      Resources/Framework/es.lproj/GeckoReporter.strings
  38. 1414
      Resources/Framework/es.lproj/MGMBugWindow.xib
  39. 1442
      Resources/Framework/es.lproj/MGMContactWindow.xib
  40. 2847
      Resources/Framework/es.lproj/MGMReportWindow.xib
  41. BIN
      Resources/Framework/pt_PT.lproj/GeckoReporter.strings
  42. 1414
      Resources/Framework/pt_PT.lproj/MGMBugWindow.xib
  43. 1442
      Resources/Framework/pt_PT.lproj/MGMContactWindow.xib
  44. 2846
      Resources/Framework/pt_PT.lproj/MGMReportWindow.xib
  45. 1
      Resources/Test/English.lproj/InfoPlist.strings
  46. 4399
      Resources/Test/English.lproj/MainMenu.xib
  47. 4399
      Resources/Test/es.lproj/MainMenu.xib
  48. 4399
      Resources/Test/pt_PT.lproj/MainMenu.xib
  49. 13
      main.m
  50. 174
      sendreport.php

12
Classes/Framework/GeckoReporter.h

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

26
Classes/Framework/MGMBugWindow.h

@ -0,0 +1,26 @@
//
// MGMBugWindow.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/2/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@class MGMSender;
@interface MGMBugWindow : NSObject {
IBOutlet NSWindow *mainWindow;
IBOutlet NSTextView *bugView;
IBOutlet NSTextView *reproduceView;
IBOutlet NSTextField *userEmailField;
IBOutlet NSButton *sendButton;
IBOutlet NSButton *cancelButton;
MGMSender *mailSender;
}
- (void)setButtonsEnabled:(BOOL)flag;
- (void)close;
- (IBAction)send:(id)sender;
- (IBAction)cancel:(id)sender;
@end

83
Classes/Framework/MGMBugWindow.m

@ -0,0 +1,83 @@
//
// MGMBugWindow.m
// GeckoReporter
//
// Created by Mr. Gecko on 1/2/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMBugWindow.h"
#import "MGMReporter.h"
#import "MGMSender.h"
#import "MGMLocalized.h"
#import "MGMLog.h"
@implementation MGMBugWindow
+ (id)new {
return [[self alloc] init];
}
- (id)init {
if (self = [super init]) {
if (![NSBundle loadNibNamed:@"MGMBugWindow" owner:self]) {
[self release];
self = nil;
} else {
NSUserDefaults *userDefautls = [NSUserDefaults standardUserDefaults];
if ([userDefautls objectForKey:MGMGRUserEmail])
[userEmailField setStringValue:[userDefautls objectForKey:MGMGRUserEmail]];
[mainWindow makeKeyAndOrderFront:self];
}
}
return self;
}
- (void)dealloc {
MGMLog(@"%s Releasing", __PRETTY_FUNCTION__);
if (mailSender!=nil)
[mailSender release];
if (mainWindow!=nil)
[mainWindow release];
[super dealloc];
self = nil;
}
- (void)setButtonsEnabled:(BOOL)flag {
[sendButton setEnabled:flag];
[cancelButton setEnabled:flag];
}
- (void)close {
[mainWindow orderOut:self];
[self release];
}
- (IBAction)send:(id)sender {
[[NSUserDefaults standardUserDefaults] setObject:[userEmailField stringValue] forKey:MGMGRUserEmail];
if (mailSender==nil) {
mailSender = [[MGMSender new] retain];
[mailSender sendBug:[[bugView textStorage] string] reproduce:[[reproduceView textStorage] string] delegate:self];
}
[sendButton setTitle:MGMLocalized(@"Sending...", nil)];
[self setButtonsEnabled:NO];
}
- (IBAction)cancel:(id)sender {
[self close];
}
- (void)sendError:(NSError *)error {
NSAlert *theAlert = [[NSAlert new] autorelease];
[theAlert addButtonWithTitle:MGMLocalized(@"Ok", nil)];
[theAlert setMessageText:MGMLocalized(@"Error could not send bug report.", nil)];
[theAlert setInformativeText:[error localizedDescription]];
[theAlert setAlertStyle:2];
[theAlert runModal];
[self setButtonsEnabled:YES];
}
- (void)sendFinished:(NSString *)received {
MGMLog(@"%@", received);
[self close];
}
@end

27
Classes/Framework/MGMContactWindow.h

@ -0,0 +1,27 @@
//
// MGMContactWindow.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/3/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@class MGMSender;
@interface MGMContactWindow : NSObject {
IBOutlet NSWindow *mainWindow;
IBOutlet NSTextView *messageView;
IBOutlet NSTextField *userEmailField;
IBOutlet NSTextField *userNameField;
IBOutlet NSPopUpButton *subjectPopUp;
IBOutlet NSButton *sendButton;
IBOutlet NSButton *cancelButton;
MGMSender *mailSender;
}
- (void)setButtonsEnabled:(BOOL)flag;
- (void)close;
- (IBAction)send:(id)sender;
- (IBAction)cancel:(id)sender;
@end

95
Classes/Framework/MGMContactWindow.m

@ -0,0 +1,95 @@
//
// MGMContactWindow.m
// GeckoReporter
//
// Created by Mr. Gecko on 1/3/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMContactWindow.h"
#import "MGMReporter.h"
#import "MGMSender.h"
#import "MGMLocalized.h"
#import "MGMLog.h"
@implementation MGMContactWindow
+ (id)new {
return [[self alloc] init];
}
- (id)init {
if (self = [super init]) {
if (![NSBundle loadNibNamed:@"MGMContactWindow" owner:self]) {
[self release];
self = nil;
} else {
NSUserDefaults *userDefautls = [NSUserDefaults standardUserDefaults];
if ([userDefautls objectForKey:MGMGRUserEmail])
[userEmailField setStringValue:[userDefautls objectForKey:MGMGRUserEmail]];
if ([userDefautls objectForKey:MGMGRUserName])
[userNameField setStringValue:[userDefautls objectForKey:MGMGRUserName]];
[mainWindow makeKeyAndOrderFront:self];
}
}
return self;
}
- (void)dealloc {
MGMLog(@"%s Releasing", __PRETTY_FUNCTION__);
if (mailSender!=nil)
[mailSender release];
if (mainWindow!=nil)
[mainWindow release];
[super dealloc];
}
- (void)setButtonsEnabled:(BOOL)flag {
[sendButton setEnabled:flag];
[cancelButton setEnabled:flag];
}
- (void)close {
[mainWindow orderOut:self];
[self release];
self = nil;
}
- (IBAction)send:(id)sender {
if ([[userEmailField stringValue] isEqualToString:@""] || [[userNameField stringValue] isEqualToString:@""]) {
NSAlert *theAlert = [[NSAlert new] autorelease];
[theAlert addButtonWithTitle:MGMLocalized(@"Ok", nil)];
[theAlert setMessageText:MGMLocalized(@"Fields not filled.", nil)];
[theAlert setInformativeText:MGMLocalized(@"Please be sure all fields are filled as all fields are required.", nil)];
[theAlert setAlertStyle:2];
[theAlert runModal];
} else {
[[NSUserDefaults standardUserDefaults] setObject:[userEmailField stringValue] forKey:MGMGRUserEmail];
[[NSUserDefaults standardUserDefaults] setObject:[userNameField stringValue] forKey:MGMGRUserName];
if (mailSender==nil) {
mailSender = [[MGMSender new] retain];
[mailSender sendMessage:[[messageView textStorage] string] subject:[subjectPopUp titleOfSelectedItem] delegate:self];
}
[sendButton setTitle:MGMLocalized(@"Sending...", nil)];
[self setButtonsEnabled:NO];
}
}
- (IBAction)cancel:(id)sender {
[self close];
}
- (void)sendError:(NSError *)error {
NSAlert *theAlert = [[NSAlert new] autorelease];
[theAlert addButtonWithTitle:MGMLocalized(@"Ok", nil)];
[theAlert setMessageText:MGMLocalized(@"Error could not send message.", nil)];
[theAlert setInformativeText:[error localizedDescription]];
[theAlert setAlertStyle:2];
[theAlert runModal];
[self setButtonsEnabled:YES];
}
- (void)sendFinished:(NSString *)received {
MGMLog(@"%@", received);
[self close];
}
@end

16
Classes/Framework/MGMFeedback.h

@ -0,0 +1,16 @@
//
// MGMFeedback.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/2/10.
// Copyright 2010 by 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

20
Classes/Framework/MGMFeedback.m

@ -0,0 +1,20 @@
//
// MGMFeedback.m
// GeckoReporter
//
// Created by Mr. Gecko on 1/2/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMFeedback.h"
#import "MGMBugWindow.h"
#import "MGMContactWindow.h"
@implementation MGMFeedback
- (IBAction)openBugReport:(id)sender {
[MGMBugWindow new];
}
- (IBAction)openContact:(id)sender {
[MGMContactWindow new];
}
@end

11
Classes/Framework/MGMLocalized.h

@ -0,0 +1,11 @@
/*
* MGMLocalized.h
* GeckoReporter
*
* Created by Mr. Gecko on 1/6/10.
* Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
*
*/
#define FRAMEWORKBUNDLE [NSBundle bundleWithIdentifier:@"com.MrGeckosMedia.GeckoReporter"]
#define MGMLocalized(key,comment) NSLocalizedStringFromTableInBundle(key, @"GeckoReporter", FRAMEWORKBUNDLE, comment)

12
Classes/Framework/MGMLog.h

@ -0,0 +1,12 @@
//
// MGMLog.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/1/10.
// Copyright 2010 by 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);

92
Classes/Framework/MGMLog.m

@ -0,0 +1,92 @@
//
// MGMLog.m
// GeckoReporter
//
// Created by Mr. Gecko on 1/1/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMLog.h"
@protocol NSFileManagerProtocol <NSObject>
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
- (NSDictionary *)fileSystemAttributesAtPath:(NSString *)path;
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
- (BOOL)removeFileAtPath:(NSString *)path handler:(id)handler;
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler;
@end
static NSRecursiveLock *MGMLock = nil;
void MGMInitLock() {
if (MGMLock==nil) {
MGMLock = [NSRecursiveLock new];
}
}
void MGMLogs(NSString *string) {
MGMInitLock();
[MGMLock lock];
char *buffer;
int length;
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
if (data!=nil) {
buffer = (char *)[data bytes];
length = [data length];
} else {
buffer = (char *)[string UTF8String];
length = [string length];
}
NSFileManager<NSFileManagerProtocol> *manager = [NSFileManager defaultManager];
fwrite(buffer, 1, length, stderr);
NSString *applicationIdentifier = [[NSBundle mainBundle] bundleIdentifier];
NSString *logPath = [[NSString stringWithFormat:@"~/Library/Logs/%@.log", applicationIdentifier] stringByExpandingTildeInPath];
NSString *log2Path = [[NSString stringWithFormat:@"~/Library/Logs/%@_2.log", applicationIdentifier] stringByExpandingTildeInPath];
NSDictionary *attributes = nil;
if ([manager respondsToSelector:@selector(attributesOfItemAtPath:error:)])
attributes = [manager attributesOfItemAtPath:logPath error:nil];
else
attributes = [manager fileSystemAttributesAtPath:logPath];
if ([[attributes objectForKey:NSFileSize] intValue]>=262144) {
if ([manager fileExistsAtPath:log2Path]) {
if ([manager respondsToSelector:@selector(removeItemAtPath:error:)])
[manager removeItemAtPath:log2Path error:nil];
else
[manager removeFileAtPath:log2Path handler:nil];
}
if ([manager respondsToSelector:@selector(moveItemAtPath:toPath:error:)])
[manager moveItemAtPath:logPath toPath:log2Path error:nil];
else
[manager movePath:logPath toPath:log2Path handler:nil];
}
FILE *logFile = fopen([logPath fileSystemRepresentation], "a");
fwrite(buffer, 1, length, logFile);
fclose(logFile);
[MGMLock unlock];
}
void MGMLog(NSString *format, ...) {
va_list ap;
va_start(ap, format);
MGMLogv(format, ap);
va_end(ap);
}
void MGMLogv(NSString *format, va_list args) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
if (![format hasSuffix:@"\n"])
format = [format stringByAppendingString:@"\n"];
NSString *message = [[[NSString alloc] initWithFormat:format arguments:args] autorelease];
NSProcessInfo *procInfo = [NSProcessInfo processInfo];
NSString *logString = [NSString stringWithFormat:@"%@ %@[%d] %@",
[[NSCalendarDate calendarDate] descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S.%F"],
[procInfo processName],
[procInfo processIdentifier],
message
];
MGMLogs(logString);
[pool drain];
}

42
Classes/Framework/MGMReportWindow.h

@ -0,0 +1,42 @@
//
// MGMReportWindow.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/27/09.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@class MGMSender;
extern NSString * const MGMSaveLastDate;
@interface MGMReportWindow : NSObject {
IBOutlet NSMenu *mainMenu;
IBOutlet NSMenuItem *hideMenu;
IBOutlet NSMenuItem *quitMenu;
IBOutlet NSWindow *mainWindow;
IBOutlet NSTextField *titleField;
IBOutlet NSTextField *dateField;
IBOutlet NSTextView *userReportView;
IBOutlet NSTextField *userEmailField;
IBOutlet NSButton *sendButton;
IBOutlet NSButton *sendAllButton;
IBOutlet NSButton *ignoreButton;
IBOutlet NSButton *ignoreAllButton;
NSString *reportFile;
NSDate *reportDate;
MGMSender *mailSender;
NSMenu *appMainMenu;
}
+ (id)newWindowWithReport:(NSString *)theReportFile reportDate:(NSDate *)theReportDate;
- (id)initWithReport:(NSString *)theReportFile reportDate:(NSDate *)theReportDate;
- (void)setButtonsEnabled:(BOOL)flag;
- (void)close;
- (IBAction)sendReport:(id)sender;
- (IBAction)sendAllReports:(id)sender;
- (IBAction)ignoreReport:(id)sender;
- (IBAction)ignoreAllReports:(id)sender;
@end

136
Classes/Framework/MGMReportWindow.m

@ -0,0 +1,136 @@
//
// MGMReportWindow.m
// GeckoReporter
//
// Created by Mr. Gecko on 12/27/09.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMReportWindow.h"
#import "MGMReporter.h"
#import "MGMSender.h"
#import "MGMSystemInfo.h"
#import "MGMLocalized.h"
#import "MGMLog.h"
NSString * const MGMSaveLastDate = @"MGMSaveLastDate";
@implementation MGMReportWindow
+ (id)newWindowWithReport:(NSString *)theReportFile reportDate:(NSDate *)theReportDate {
return [[self alloc] initWithReport:theReportFile reportDate:theReportDate];
}
- (id)initWithReport:(NSString *)theReportFile reportDate:(NSDate *)theReportDate {
if (self = [super init]) {
if (![NSBundle loadNibNamed:@"MGMReportWindow" owner:self]) {
[self release];
self = nil;
} else {
reportFile = [theReportFile retain];
reportDate = [theReportDate retain];
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSUserDefaults *userDefautls = [NSUserDefaults standardUserDefaults];
MGMSystemInfo *sysInfo = [MGMSystemInfo new];
NSString *applicationName = [sysInfo applicationName];
appMainMenu = [[[NSApplication sharedApplication] mainMenu] retain];
[[NSApplication sharedApplication] setMainMenu:mainMenu];
if ([[infoDictionary objectForKey:@"LSUIElement"] boolValue])
[[NSApplication sharedApplication] requestUserAttention:NSInformationalRequest];
else
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
NSBeep();
if (applicationName==nil)
applicationName = [sysInfo applicationEXECName];
[hideMenu setTitle:[NSString stringWithFormat:MGMLocalized(@"Hide %@", nil), applicationName]];
[quitMenu setTitle:[NSString stringWithFormat:MGMLocalized(@"Quit %@", nil), applicationName]];
[titleField setStringValue:[NSString stringWithFormat:MGMLocalized(@"%@ crashed the last time you ran it. Would you like to send me a crash report so I can look into it?", nil), applicationName]];
[dateField setStringValue:[reportDate descriptionWithCalendarFormat:MGMLocalized(@"%a, %m/%d/%Y %I:%M:%S %p", nil) timeZone:nil locale:nil]];
[mainWindow setTitle:[NSString stringWithFormat:MGMLocalized(@"%@ Crashed", nil), applicationName]];
if ([userDefautls objectForKey:MGMGRUserEmail])
[userEmailField setStringValue:[userDefautls objectForKey:MGMGRUserEmail]];
[mainWindow makeKeyAndOrderFront:self];
}
}
return self;
}
- (void)dealloc {
#if releaseDebug
MGMLog(@"%s Releasing", __PRETTY_FUNCTION__);
#endif
if (reportFile!=nil)
[reportFile release];
if (reportDate!=nil)
[reportDate release];
if (mailSender!=nil)
[mailSender release];
if (mainWindow!=nil)
[mainWindow release];
[super dealloc];
}
- (void)setButtonsEnabled:(BOOL)flag {
[sendButton setEnabled:flag];
[sendAllButton setEnabled:flag];
[ignoreButton setEnabled:flag];
[ignoreAllButton setEnabled:flag];
}
- (void)close {
[[NSApplication sharedApplication] setMainMenu:appMainMenu];
[appMainMenu release];
[mainWindow orderOut:self];
[self release];
self = nil;
}
- (IBAction)sendReport:(id)sender {
[[NSUserDefaults standardUserDefaults] setObject:[userEmailField stringValue] forKey:MGMGRUserEmail];
if (mailSender==nil) {
mailSender = [[MGMSender new] retain];
[mailSender sendReport:reportFile reportDate:reportDate userReport:[[userReportView textStorage] string] delegate:self];
}
[sendButton setTitle:MGMLocalized(@"Sending...", nil)];
[self setButtonsEnabled:NO];
}
- (IBAction)sendAllReports:(id)sender {
[[NSUserDefaults standardUserDefaults] setObject:[userEmailField stringValue] forKey:MGMGRUserEmail];
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:MGMGRSendAll];
if (mailSender==nil) {
mailSender = [[MGMSender new] retain];
[mailSender sendReport:reportFile reportDate:reportDate userReport:[[userReportView textStorage] string] delegate:self];
}
[sendAllButton setTitle:MGMLocalized(@"Sending...", nil)];
[self setButtonsEnabled:NO];
}
- (IBAction)ignoreReport:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], MGMSaveLastDate, nil]];
[self close];
}
- (IBAction)ignoreAllReports:(id)sender {
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:MGMGRIgnoreAll];
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], MGMSaveLastDate, nil]];
[self close];
}
- (void)sendError:(NSError *)error {
NSAlert *theAlert = [[NSAlert new] autorelease];
[theAlert addButtonWithTitle:MGMLocalized(@"Ok", nil)];
[theAlert setMessageText:MGMLocalized(@"Error could not send crash report.", nil)];
[theAlert setInformativeText:[error localizedDescription]];
[theAlert setAlertStyle:2];
[theAlert runModal];
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], MGMSaveLastDate, nil]];
[self close];
}
- (void)sendFinished:(NSString *)received {
MGMLog(@"%@", received);
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], MGMSaveLastDate, nil]];
[self close];
}
@end

28
Classes/Framework/MGMReporter.h

@ -0,0 +1,28 @@
//
// MGMReporter.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/27/09.
// Copyright 2010 by 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 releaseDebug 1
@class MGMSender;
@interface MGMReporter : NSObject {
BOOL foundReport;
NSDate *lastDate;
MGMSender *mailSender;
}
+ (id)sharedReporter;
@end

113
Classes/Framework/MGMReporter.m

@ -0,0 +1,113 @@
//
// MGMReporter.m
// GeckoReporter
//
// Created by Mr. Gecko on 12/27/09.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMReporter.h"
#import "MGMReportWindow.h"
#import "MGMSender.h"
#import "MGMSystemInfo.h"
#import "MGMLog.h"
static MGMReporter *MGMReporterSingleton = nil;
NSString * const MGMReportsPath = @"~/Library/Logs/CrashReporter";
NSString * const MGMGRDoneNotification = @"MGMGRDoneNotification";
NSString * const MGMGRUserEmail = @"MGMGRUserEmail";
NSString * const MGMGRUserName = @"MGMGRUserName";
NSString * const MGMGRLastCrashDate = @"MGMGRLastCrashDate";
NSString * const MGMGRSendAll = @"MGMGRSendAll";
NSString * const MGMGRIgnoreAll = @"MGMGRIgnoreAll";
@implementation MGMReporter
+ (id)sharedReporter {
@synchronized(self) {
if (MGMReporterSingleton == nil) {
MGMReporterSingleton = [[self alloc] init];
}
}
return MGMReporterSingleton;
}
- (id)init {
if (self = [super init]) {
foundReport = NO;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(done:) name:MGMGRDoneNotification object:nil];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if ([userDefaults objectForKey:MGMGRIgnoreAll]==nil || ![[userDefaults objectForKey:MGMGRIgnoreAll] boolValue]) {
NSFileManager *manager = [NSFileManager defaultManager];
NSString *applicationName = [[MGMSystemInfo new] applicationEXECName];
if (lastDate!=nil) {
[lastDate release];
lastDate = nil;
}
lastDate = [[userDefaults objectForKey:MGMGRLastCrashDate] retain];
NSDirectoryEnumerator *crashFiles = [manager enumeratorAtPath:[MGMReportsPath stringByExpandingTildeInPath]];
NSString *crashFile = nil;
NSString *lastCrashFile = nil;
while (crashFile = [crashFiles nextObject]) {
if ([crashFile hasPrefix:applicationName]) {
NSString *file = [[MGMReportsPath stringByAppendingPathComponent:crashFile] stringByResolvingSymlinksInPath];
BOOL readable = [manager isReadableFileAtPath:file];
NSDictionary *attributes = [crashFiles fileAttributes];
NSDate *creationDate = [attributes objectForKey:NSFileCreationDate];
if (readable && (lastDate==nil || (creationDate==[lastDate laterDate:creationDate]))) {
if (lastDate!=nil) {
[lastDate release];
lastDate = nil;
}
lastDate = [creationDate retain];
lastCrashFile = file;
foundReport = YES;
}
}
}
if (foundReport) {
MGMLog(@"Latest Crash Report %@, %@", lastDate, lastCrashFile);
if ([userDefaults objectForKey:MGMGRSendAll]!=nil && [[userDefaults objectForKey:MGMGRSendAll] boolValue]) {
if (mailSender==nil) {
mailSender = [[MGMSender new] retain];
[mailSender sendReport:lastCrashFile reportDate:lastDate userReport:@"User set to send all." delegate:self];
}
} else {
[MGMReportWindow newWindowWithReport:lastCrashFile reportDate:lastDate];
}
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], MGMSaveLastDate, nil]];
}
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], MGMSaveLastDate, nil]];
}
}
return self;
}
- (void)dealloc {
#if releaseDebug
MGMLog(@"%s Releasing", __PRETTY_FUNCTION__);
#endif
if (lastDate!=nil)
[lastDate release];
if (mailSender!=nil)
[mailSender release];
[super dealloc];
}
- (void)done:(NSNotification *)note {
if ([[note userInfo] objectForKey:MGMSaveLastDate]!=nil && [[[note userInfo] objectForKey:MGMSaveLastDate] boolValue]) {
[[NSUserDefaults standardUserDefaults] setObject:lastDate forKey:MGMGRLastCrashDate];
}
[self release];
self = nil;
}
- (void)sendError:(NSError *)error {
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], MGMSaveLastDate, nil]];
}
- (void)sendFinished:(NSString *)received {
MGMLog(@"%@", received);
[[NSNotificationCenter defaultCenter] postNotificationName:MGMGRDoneNotification object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], MGMSaveLastDate, nil]];
}
@end

20
Classes/Framework/MGMSender.h

@ -0,0 +1,20 @@
//
// MGMSender.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/28/09.
// Copyright 2010 by 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

391
Classes/Framework/MGMSender.m

@ -0,0 +1,391 @@
//
// MGMSender.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/28/09.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMSender.h"
#import "MGMReporter.h"
#import "MGMSystemInfo.h"
#import "MGMLocalized.h"
#import "MGMLog.h"
NSString * const MGMDefaultTimeZone = @"GMT";
NSString * const MGMDefaultTimeFormat = @"%a, %m/%d/%y %H:%M:%S %Z";
NSString * const MGMDefaultCrashEmail = @"crashreports@mrgeckosmedia.com";
NSString * const MGMDefaultBugsEmail = @"bugs@mrgeckosmedia.com";
NSString * const MGMDefaultContactEmail = @"support@mrgeckosmedia.com";
NSString * const MGMDefaultURL = @"https://mrgeckosmedia.com/sendreport.php";
NSString * const MGMGRTimeZone = @"MGMGRTimeZone";
NSString * const MGMGRTimeFormat = @"MGMGRTimeFormat";
NSString * const MGMGRReportFileAttached = @"MGMGRReportFileAttached";
NSString * const MGMGRCrashEmail = @"MGMGRCrashEmail";
NSString * const MGMGRBugsEmail = @"MGMGRBugsEmail";
NSString * const MGMGRContactEmail = @"MGMGRContactEmail";
NSString * const MGMGRURL = @"MGMGRURL";
NSString * const MGMGRLogFiles = @"MGMGRLogFiles";
@interface MGMSender (MGMPrivate)
- (NSData *)buildBodyWithObjects:(NSDictionary *)theObjects boundary:(NSString *)theBoundary;
- (NSDictionary *)defaultObjects;
@end
@implementation MGMSender
- (void)dealloc {
#if releaseDebug
MGMLog(@"%s Releasing", __PRETTY_FUNCTION__);
#endif
if (theConnection!=nil)
[theConnection release];
if (receivedData!=nil)
[receivedData release];
[super dealloc];
}
- (NSData *)buildBodyWithObjects:(NSDictionary *)theObjects boundary:(NSString *)theBoundary {
NSMutableData *data = [NSMutableData data];
NSArray *keys = [theObjects allKeys];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSFileManager *manager = [NSFileManager defaultManager];
NSString *timeZone, *timeFormat;
if ([userDefaults objectForKey:MGMGRTimeZone]!=nil && ![[userDefaults objectForKey:MGMGRTimeZone] isEqualToString:@""]) {
timeZone = [userDefaults objectForKey:MGMGRTimeZone];
} else if ([infoDictionary objectForKey:MGMGRTimeZone]!=nil && ![[infoDictionary objectForKey:MGMGRTimeZone] isEqualToString:@""]) {
timeZone = [infoDictionary objectForKey:MGMGRTimeZone];
} else {
timeZone = MGMDefaultTimeZone;
}
if ([userDefaults objectForKey:MGMGRTimeFormat]!=nil && ![[userDefaults objectForKey:MGMGRTimeFormat] isEqualToString:@""]) {
timeFormat = [userDefaults objectForKey:MGMGRTimeFormat];
} else if ([infoDictionary objectForKey:MGMGRTimeFormat]!=nil && ![[infoDictionary objectForKey:MGMGRTimeFormat] isEqualToString:@""]) {
timeFormat = [infoDictionary objectForKey:MGMGRTimeFormat];
} else {
timeFormat = MGMDefaultTimeFormat;
}
for (int i=0; i<[keys count]; i++) {
NSString *key = [keys objectAtIndex:i];
id object = [theObjects objectForKey:key];
[data appendData:[[NSString stringWithFormat:@"--%@\r\n", theBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
if ([object isKindOfClass:[NSString class]]) {
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[object dataUsingEncoding:NSUTF8StringEncoding]];
} else if ([object isKindOfClass:[NSNumber class]]) {
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[[object stringValue] dataUsingEncoding:NSUTF8StringEncoding]];
} else if ([object isKindOfClass:[NSData class]]) {
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:object];
} else if ([object isKindOfClass:[NSDate class]]) {
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
NSString *date;
if ([timeZone length]==3) {
date = [object descriptionWithCalendarFormat:timeFormat timeZone:[NSTimeZone timeZoneWithAbbreviation:timeZone] locale:nil];
} else {
date = [object descriptionWithCalendarFormat:timeFormat timeZone:[NSTimeZone timeZoneWithName:timeZone] locale:nil];
}
[data appendData:[date dataUsingEncoding:NSUTF8StringEncoding]];
} else if ([object isKindOfClass:[NSURL class]]) {
if ([object isFileURL]) {
NSString *objectPath = [object path];
if ([manager fileExistsAtPath:objectPath] && [manager isReadableFileAtPath:objectPath]) {
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", key, [objectPath lastPathComponent]] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"Content-Type: plain/text\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[NSData dataWithContentsOfFile:objectPath]];
}
} else {
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[[object absoluteString] dataUsingEncoding:NSUTF8StringEncoding]];
}
}
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
}
[data appendData:[[NSString stringWithFormat:@"--%@--", theBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
return data;
}
- (NSDictionary *)defaultObjects {
MGMSystemInfo *sysInfo = [MGMSystemInfo new];
NSMutableDictionary *objects = [NSMutableDictionary new];
[objects setObject:[sysInfo frameworkVersion] forKey:@"GRVersion"];
[objects setObject:[sysInfo applicationName] forKey:@"Application"];
[objects setObject:[sysInfo applicationIdentifier] forKey:@"Application Identifier"];
[objects setObject:[sysInfo applicationVersion] forKey:@"Application Version"];
[objects setObject:[sysInfo language] forKey:@"Language"];
[objects setObject:[NSString stringWithFormat:@"%@ %@", [sysInfo architecture], [sysInfo CPUFamily]] forKey:@"System Architecture"];
[objects setObject:[NSNumber numberWithInt:[sysInfo CPUCount]] forKey:@"CPU Count"];
[objects setObject:[sysInfo modelName] forKey:@"Model Name"];
[objects setObject:[sysInfo model] forKey:@"Model"];
[objects setObject:[NSString stringWithFormat:@"%@ %@", [sysInfo OSVersion], [sysInfo OSVersionName]] forKey:@"System Version"];
double CPUMHz = (double)[sysInfo CPUMHz];
NSString *CPUFreq = @"MHz";
if (CPUMHz>=1000) {
CPUFreq = @"GHz";
CPUMHz /= 1000;
if (CPUMHz>=1000) {
CPUFreq = @"THz";
CPUMHz /= 1000;
}
}
[objects setObject:[NSString stringWithFormat:@"%.2f %@", CPUMHz, CPUFreq] forKey:@"CPU Speed"];
double RAMSize = (double)[sysInfo RAMSize];
NSString *RAMType = @"MB";
if (RAMSize>=1024) {
RAMType = @"GB";
RAMSize /= 1024;
if (RAMSize>=1024) {
RAMType = @"TB";
RAMSize /= 1024;
}
}
[objects setObject:[NSString stringWithFormat:@"%.2f %@", RAMSize, RAMType] forKey:@"RAM Size"];
return objects;
}
- (void)sendReport:(NSString *)theReportPath reportDate:(NSDate *)theReportDate userReport:(NSString *)theUserReport delegate:(id)theDelegate {
if (theDelegate!=nil)
delegate = theDelegate;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
MGMSystemInfo *sysInfo = [MGMSystemInfo new];
NSString *email = nil, *url = nil, *userEmail = nil, *logFiles = nil;
BOOL reportAttached = NO;
if ([userDefaults objectForKey:MGMGRCrashEmail]!=nil && ![[userDefaults objectForKey:MGMGRCrashEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRCrashEmail];
} else if ([infoDictionary objectForKey:MGMGRCrashEmail]!=nil && ![[infoDictionary objectForKey:MGMGRCrashEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRCrashEmail];
} else if ([userDefaults objectForKey:MGMGRBugsEmail]!=nil && ![[userDefaults objectForKey:MGMGRBugsEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRBugsEmail];
} else if ([infoDictionary objectForKey:MGMGRBugsEmail]!=nil && ![[infoDictionary objectForKey:MGMGRBugsEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRBugsEmail];
} else if ([userDefaults objectForKey:MGMGRContactEmail]!=nil && ![[userDefaults objectForKey:MGMGRContactEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRContactEmail];
} else if ([infoDictionary objectForKey:MGMGRContactEmail]!=nil && ![[infoDictionary objectForKey:MGMGRContactEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRContactEmail];
} else {
email = MGMDefaultCrashEmail;
}
if ([userDefaults objectForKey:MGMGRURL]!=nil && ![[userDefaults objectForKey:MGMGRURL] isEqualToString:@""]) {
url = [userDefaults objectForKey:MGMGRURL];
} else if ([infoDictionary objectForKey:MGMGRURL]!=nil && ![[infoDictionary objectForKey:MGMGRURL] isEqualToString:@""]) {
url = [infoDictionary objectForKey:MGMGRURL];
} else {
url = MGMDefaultURL;
}
if ([userDefaults objectForKey:MGMGRUserEmail]!=nil && ![[userDefaults objectForKey:MGMGRUserEmail] isEqualToString:@""]) {
userEmail = [userDefaults objectForKey:MGMGRUserEmail];
}
if ([userDefaults objectForKey:MGMGRReportFileAttached]!=nil) {
reportAttached = [[userDefaults objectForKey:MGMGRReportFileAttached] boolValue];
} else if ([infoDictionary objectForKey:MGMGRReportFileAttached]!=nil) {
reportAttached = [[infoDictionary objectForKey:MGMGRReportFileAttached] boolValue];
}
if ([userDefaults objectForKey:MGMGRLogFiles]!=nil && ![[userDefaults objectForKey:MGMGRLogFiles] isEqualToString:@""]) {
logFiles = [userDefaults objectForKey:MGMGRLogFiles];
} else if ([infoDictionary objectForKey:MGMGRLogFiles]!=nil && ![[infoDictionary objectForKey:MGMGRLogFiles] isEqualToString:@""]) {
logFiles = [infoDictionary objectForKey:MGMGRLogFiles];
}
srandomdev();
NSString *boundary = [NSString stringWithFormat:@"----Boundary+%d", random()%100000];
NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];
[postRequest setHTTPMethod:@"POST"];
[postRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary, nil] forHTTPHeaderField:@"Content-Type"];
NSMutableDictionary *objects = [NSMutableDictionary dictionaryWithDictionary:[self defaultObjects]];
[objects setObject:@"crash" forKey:@"GRType"];
if (email!=nil)
[objects setObject:email forKey:@"GREmail"];
[objects setObject:[NSString stringWithFormat:@"Crash Report for %@", [sysInfo applicationName]] forKey:@"GRSubject"];
[objects setObject:(reportAttached ? @"YES" : @"NO") forKey:@"GRReportAttached"];
if (theUserReport!=nil)
[objects setObject:theUserReport forKey:@"GRUserReport"];
if (userEmail!=nil)
[objects setObject:userEmail forKey:@"User Email Address"];
if (theReportDate!=nil)
[objects setObject:theReportDate forKey:@"Crash Report Date"];
if (theReportPath!=nil && ![theReportPath isEqualToString:@""])
[objects setObject:[NSURL fileURLWithPath:theReportPath] forKey:@"reportFile"];
if (logFiles!=nil && ![logFiles isEqualToString:@""]) {
NSArray *logs = [logFiles componentsSeparatedByString:@" "];
for (int i=0; i<[logs count]; i++) {
[objects setObject:[NSURL fileURLWithPath:[[logs objectAtIndex:i] stringByExpandingTildeInPath]] forKey:[NSString stringWithFormat:@"logFile%d", i]];
}
}
[postRequest setHTTPBody:[self buildBodyWithObjects:objects boundary:boundary]];
theConnection = [[NSURLConnection connectionWithRequest:postRequest delegate:self] retain];
if (theConnection) {
receivedData = [[NSMutableData data] retain];
}
}
- (void)sendBug:(NSString *)theBug reproduce:(NSString *)theReproduce delegate:(id)theDelegate {
if (theDelegate!=nil)
delegate = theDelegate;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
MGMSystemInfo *sysInfo = [MGMSystemInfo new];
NSString *email = nil, *url = nil, *userEmail = nil;
if ([userDefaults objectForKey:MGMGRBugsEmail]!=nil && ![[userDefaults objectForKey:MGMGRBugsEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRBugsEmail];
} else if ([infoDictionary objectForKey:MGMGRBugsEmail]!=nil && ![[infoDictionary objectForKey:MGMGRBugsEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRBugsEmail];
} else if ([userDefaults objectForKey:MGMGRCrashEmail]!=nil && ![[userDefaults objectForKey:MGMGRCrashEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRCrashEmail];
} else if ([infoDictionary objectForKey:MGMGRCrashEmail]!=nil && ![[infoDictionary objectForKey:MGMGRCrashEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRCrashEmail];
} else if ([userDefaults objectForKey:MGMGRContactEmail]!=nil && ![[userDefaults objectForKey:MGMGRContactEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRContactEmail];
} else if ([infoDictionary objectForKey:MGMGRContactEmail]!=nil && ![[infoDictionary objectForKey:MGMGRContactEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRContactEmail];
} else {
email = MGMDefaultBugsEmail;
}
if ([userDefaults objectForKey:MGMGRURL]!=nil && ![[userDefaults objectForKey:MGMGRURL] isEqualToString:@""]) {
url = [userDefaults objectForKey:MGMGRURL];
} else if ([infoDictionary objectForKey:MGMGRURL]!=nil && ![[infoDictionary objectForKey:MGMGRURL] isEqualToString:@""]) {
url = [infoDictionary objectForKey:MGMGRURL];
} else {
url = MGMDefaultURL;
}
if ([userDefaults objectForKey:MGMGRUserEmail]!=nil && ![[userDefaults objectForKey:MGMGRUserEmail] isEqualToString:@""]) {
userEmail = [userDefaults objectForKey:MGMGRUserEmail];
}
srandomdev();
NSString *boundary = [NSString stringWithFormat:@"----Boundary+%d", random()%100000];
NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];
[postRequest setHTTPMethod:@"POST"];
[postRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary, nil] forHTTPHeaderField:@"Content-Type"];
NSMutableDictionary *objects = [NSMutableDictionary dictionaryWithDictionary:[self defaultObjects]];
[objects setObject:@"bug" forKey:@"GRType"];
if (email!=nil)
[objects setObject:email forKey:@"GREmail"];
[objects setObject:[NSString stringWithFormat:@"Bug Report for %@", [sysInfo applicationName]] forKey:@"GRSubject"];
if (userEmail!=nil)
[objects setObject:userEmail forKey:@"User Email Address"];
if (theBug!=nil)
[objects setObject:theBug forKey:@"GRBug"];
if (theReproduce!=nil)
[objects setObject:theReproduce forKey:@"GRReproduce"];
[postRequest setHTTPBody:[self buildBodyWithObjects:objects boundary:boundary]];
theConnection = [[NSURLConnection connectionWithRequest:postRequest delegate:self] retain];
if (theConnection) {
receivedData = [[NSMutableData data] retain];
}
}
- (void)sendMessage:(NSString *)theMessage subject:(NSString *)theSubject delegate:(id)theDelegate {
if (theDelegate!=nil)
delegate = theDelegate;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
MGMSystemInfo *sysInfo = [MGMSystemInfo new];
NSString *email = nil, *url = nil, *userEmail = nil, *userName = nil;
if ([userDefaults objectForKey:MGMGRBugsEmail]!=nil && ![[userDefaults objectForKey:MGMGRBugsEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRBugsEmail];
} else if ([infoDictionary objectForKey:MGMGRBugsEmail]!=nil && ![[infoDictionary objectForKey:MGMGRBugsEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRBugsEmail];
} else if ([userDefaults objectForKey:MGMGRCrashEmail]!=nil && ![[userDefaults objectForKey:MGMGRCrashEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRCrashEmail];
} else if ([infoDictionary objectForKey:MGMGRCrashEmail]!=nil && ![[infoDictionary objectForKey:MGMGRCrashEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRCrashEmail];
} else if ([userDefaults objectForKey:MGMGRContactEmail]!=nil && ![[userDefaults objectForKey:MGMGRContactEmail] isEqualToString:@""]) {
email = [userDefaults objectForKey:MGMGRContactEmail];
} else if ([infoDictionary objectForKey:MGMGRContactEmail]!=nil && ![[infoDictionary objectForKey:MGMGRContactEmail] isEqualToString:@""]) {
email = [infoDictionary objectForKey:MGMGRContactEmail];
} else {
email = MGMDefaultBugsEmail;
}
if ([userDefaults objectForKey:MGMGRURL]!=nil && ![[userDefaults objectForKey:MGMGRURL] isEqualToString:@""]) {
url = [userDefaults objectForKey:MGMGRURL];
} else if ([infoDictionary objectForKey:MGMGRURL]!=nil && ![[infoDictionary objectForKey:MGMGRURL] isEqualToString:@""]) {
url = [infoDictionary objectForKey:MGMGRURL];
} else {
url = MGMDefaultURL;
}
if ([userDefaults objectForKey:MGMGRUserEmail]!=nil && ![[userDefaults objectForKey:MGMGRUserEmail] isEqualToString:@""]) {
userEmail = [userDefaults objectForKey:MGMGRUserEmail];
}
if ([userDefaults objectForKey:MGMGRUserName]!=nil && ![[userDefaults objectForKey:MGMGRUserName] isEqualToString:@""]) {
userName = [userDefaults objectForKey:MGMGRUserName];
}
srandomdev();
NSString *boundary = [NSString stringWithFormat:@"----Boundary+%d", random()%100000];
NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];
[postRequest setHTTPMethod:@"POST"];
[postRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary, nil] forHTTPHeaderField:@"Content-Type"];
NSMutableDictionary *objects = [NSMutableDictionary dictionaryWithDictionary:[self defaultObjects]];
[objects setObject:@"contact" forKey:@"GRType"];
if (email!=nil)
[objects setObject:email forKey:@"GREmail"];
[objects setObject:[NSString stringWithFormat:@"%@ for %@", theSubject, [sysInfo applicationName]] forKey:@"GRSubject"];
if (userEmail!=nil)
[objects setObject:userEmail forKey:@"User Email Address"];
if (userEmail!=nil)
[objects setObject:userName forKey:@"User Name"];
if (theMessage!=nil)
[objects setObject:theMessage forKey:@"GRMessage"];
[postRequest setHTTPBody:[self buildBodyWithObjects:objects boundary:boundary]];
theConnection = [[NSURLConnection connectionWithRequest:postRequest delegate:self] retain];
if (theConnection) {
receivedData = [[NSMutableData data] retain];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response {
if ([response statusCode]!=200) {
[connection cancel];
NSError *error = [NSError errorWithDomain:@"com.MrGeckosMedia.GRStatus" code:1 userInfo:
[NSDictionary dictionaryWithObject:[NSString stringWithFormat:MGMLocalized(@"Status Code Returned %d", nil), [response statusCode]]
forKey:NSLocalizedDescriptionKey]];
MGMLog(@"%@", [error localizedDescription]);
if (delegate!=nil && [delegate respondsToSelector:@selector(sendError:)])
[delegate sendError:error];
[self release];
self = nil;
} else {
[receivedData setLength:0];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
MGMLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
if (delegate!=nil && [delegate respondsToSelector:@selector(sendError:)])
[delegate sendError:error];
[self release];
self = nil;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
if (receivedData!=nil) {
NSString *receivedString = [[[NSString alloc] initWithData:[NSData dataWithData:receivedData] encoding:NSUTF8StringEncoding] autorelease];
if (delegate!=nil && [delegate respondsToSelector:@selector(sendFinished:)])
[delegate sendFinished:receivedString];
}
[self release];
self = nil;
}
@end

15
Classes/Framework/MGMSenderDelegate.h

@ -0,0 +1,15 @@
//
// MGMSenderDelegate.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/2/10.
// Copyright 2010 by 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

37
Classes/Framework/MGMSystemInfo.h

@ -0,0 +1,37 @@
//
// MGMSystemInfo.h
// GeckoReporter
//
// Created by Mr. Gecko on 12/31/09.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@interface MGMSystemInfo : NSObject {
}
- (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;
- (NSString *)language;
- (NSString *)applicationIdentifier;
- (NSString *)applicationName;
- (NSString *)applicationEXECName;
- (NSString *)applicationVersion;
- (NSBundle *)frameworkBundle;
- (NSString *)frameworkVersion;
- (NSString *)useragentWithApplicationNameAndVersion:(NSString *)nameAndVersion;
- (NSString *)useragent;
@end

255
Classes/Framework/MGMSystemInfo.m

@ -0,0 +1,255 @@
//
// MGMSystemInfo.m
// GeckoReporter
//
// Created by Mr. Gecko on 12/31/09.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMSystemInfo.h"
#import "MGMReporter.h"
#import "MGMLocalized.h"
#import "MGMLog.h"
#import <sys/sysctl.h>
#ifndef CPU_TYPE_ARM
#define CPU_TYPE_ARM ((cpu_type_t) 12)
#endif
NSString * const MGMCPUType = @"hw.cputype";
NSString * const MGM64Capable = @"hw.cpu64bit_capable";
NSString * const MGM64Bit = @"hw.optional.64bitops";
NSString * const MGMX8_664 = @"hw.optional.x86_64";
NSString * const MGMCPUFamily = @"hw.cpufamily";
NSString * const MGMCPUCount = @"hw.ncpu";
NSString * const MGMModel = @"hw.model";
@interface MGMSystemInfo (MGMPrivate)
- (int)valueFromSystem:(NSString *)theName;
- (NSString *)stringFromSystem:(NSString *)theName;
@end
@implementation MGMSystemInfo
+ (id)new {
return [[[self alloc] init] autorelease];
}
- (int)valueFromSystem:(NSString *)theName {
int value = 0;
unsigned long length = sizeof(value);
if (sysctlbyname([theName UTF8String], &value, &length, NULL, 0)==0) {
return value;
}
return -1;
}
- (NSString *)stringFromSystem:(NSString *)theName {
unsigned long length = sizeof(int);
if (sysctlbyname([theName UTF8String], NULL, &length, NULL, 0)==0) {
char *utf8String = (char *)malloc(sizeof(char) * length);
if (sysctlbyname([theName UTF8String], utf8String, &length, NULL, 0)==0) {
NSString *returnString = [NSString stringWithUTF8String:utf8String];
if (utf8String!=NULL)
free(utf8String);
return returnString;
}
if (utf8String!=NULL)
free(utf8String);
}
return nil;
}
- (NSString *)architecture {
switch ([self valueFromSystem:MGMCPUType]) {
case CPU_TYPE_MC680x0:
return @"m68k";
break;
case CPU_TYPE_X86:
case CPU_TYPE_X86_64:
return @"Intel";
break;
case CPU_TYPE_POWERPC:
case CPU_TYPE_POWERPC64:
return @"PowerPC";
break;
case CPU_TYPE_ARM:
return @"ARM";
break;
}
return @"Unknown";
}
- (BOOL)is64Bit {
int value = [self valueFromSystem:MGM64Capable];
if (value==-1)
value = [self valueFromSystem:MGM64Bit];
if (value==-1)
value = [self valueFromSystem:MGMX8_664];
if (value==-1)
value = 0;
return (value==1);
}
- (NSString *)CPUFamily {
switch ([self valueFromSystem:MGMCPUType]) {
case CPU_TYPE_X86:
case CPU_TYPE_X86_64:
if ([self is64Bit]) {
return @"Core 2 Duo";
} else {
if ([self CPUCount]==1)
return @"Core Solo";
else
return @"Core Duo";
}
break;
case CPU_TYPE_POWERPC:
case CPU_TYPE_POWERPC64:
switch ([self valueFromSystem:MGMCPUFamily]) {
case CPUFAMILY_POWERPC_G3:
return @"G3";
break;
case CPUFAMILY_POWERPC_G4:
return @"G4";
break;
case CPUFAMILY_POWERPC_G5:
return @"G5";
break;
}
break;
}
return @"Unknown";
}
- (int)CPUCount {
return [self valueFromSystem:MGMCPUCount];
}
- (NSString *)model {
return [self stringFromSystem:MGMModel];
}
- (NSString *)modelName {
NSString *model = [self stringFromSystem:MGMModel];
NSDictionary *modelNames = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"ModelNames" ofType:@"plist"]];
NSString *modelName = [modelNames objectForKey:model];
if (modelName!=nil)
return modelName;
return model;
}
- (int)CPUMHz {
SInt32 clockSpeed;
if (Gestalt(gestaltProcClkSpeedMHz, &clockSpeed)==noErr) {
return (int)clockSpeed;
}
return -1;
}
- (int)RAMSize {
SInt32 ramSize;
if (Gestalt(gestaltPhysicalRAMSizeInMegabytes, &ramSize)==noErr) {
return (int)ramSize;
}
return -1;
}
- (int)OSMajorVersion {
SInt32 majorVersion;
if (Gestalt(gestaltSystemVersionMajor, &majorVersion)==noErr) {
return (int)majorVersion;
}
return -1;
}
- (int)OSMinorVersion {
SInt32 minorVersion;
if (Gestalt(gestaltSystemVersionMinor, &minorVersion)==noErr) {
return (int)minorVersion;
}
return -1;
}
- (int)OSBugFixVersion {
SInt32 bugFixVersion;
if (Gestalt(gestaltSystemVersionBugFix, &bugFixVersion)==noErr) {
return (int)bugFixVersion;
}
return -1;
}
- (NSString *)OSVersion {
int majorVersion = [self OSMajorVersion];
int minorVersion = [self OSMinorVersion];
int bugFixVersion = [self OSBugFixVersion];
return [NSString stringWithFormat:@"%d.%d.%d", majorVersion, minorVersion, bugFixVersion];
}
- (NSString *)OSVersionName {
if ([self OSMajorVersion]==10) {
int minorVersion = [self OSMinorVersion];
if (minorVersion==0)
return @"Cheetah";
if (minorVersion==1)
return @"Puma";
if (minorVersion==2)
return @"Jaguar";
if (minorVersion==3)
return @"Panther";
if (minorVersion==4)
return @"Tiger";
if (minorVersion==5)
return @"Leopard";
if (minorVersion==6)
return @"Snow Leopard";
if (minorVersion==7)
return @"Garfield";
if (minorVersion==8)
return @"Liger";
}
return @"Unknown";
}
- (NSString *)language {
NSArray *languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
if (languages!=nil && [languages count]>=1)
return [languages objectAtIndex:0];
return @"Unknown";
}
- (NSString *)applicationIdentifier {
return [[NSBundle mainBundle] bundleIdentifier];
}
- (NSString *)applicationName {
return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
}
- (NSString *)applicationEXECName {
return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleExecutable"];
}
- (NSString *)applicationVersion {
return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
}
- (NSBundle *)frameworkBundle {
return FRAMEWORKBUNDLE;
}
- (NSString *)frameworkVersion {
return [FRAMEWORKBUNDLE objectForInfoDictionaryKey:@"CFBundleVersion"];
}
- (NSString *)useragentWithApplicationNameAndVersion:(NSString *)nameAndVersion {
if (nameAndVersion==nil)
nameAndVersion = [NSString stringWithFormat:@"%@/%@", [self applicationName], [self applicationVersion]];
NSString *useragent = [NSString stringWithFormat:@"%@ (Macintosh; U; %@ ", nameAndVersion, [self architecture]];
if ([self OSMajorVersion]==10)
useragent = [useragent stringByAppendingString:@"Mac OS X "];
else
useragent = [useragent stringByAppendingString:@"Mac OS "];
useragent = [useragent stringByAppendingFormat:@"%@; %@)", [self OSVersion], [self language]];
return useragent;
}
- (NSString *)useragent {
return [self useragentWithApplicationNameAndVersion:nil];
}
@end

19
Classes/Test/MGMController.h

@ -0,0 +1,19 @@
//
// MGMController.h
// GeckoReporter
//
// Created by Mr. Gecko on 1/1/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@interface MGMController : NSObject {
IBOutlet NSWindow *mainWindow;
NSString *crashString;
}
- (IBAction)crashApplication:(id)sender;
- (IBAction)RemoveLastDate:(id)sender;
- (IBAction)RemoveSendAll:(id)sender;
- (IBAction)RemoveIgnoreAll:(id)sender;
@end

32
Classes/Test/MGMController.m

@ -0,0 +1,32 @@
//
// MGMController.m
// GeckoReporter
//
// Created by Mr. Gecko on 1/1/10.
// Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMController.h"
#import <GeckoReporter/GeckoReporter.h>
@implementation MGMController
- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setup) name:MGMGRDoneNotification object:nil];
[MGMReporter sharedReporter];
}
- (void)setup {
[mainWindow makeKeyAndOrderFront:self];
}
- (IBAction)crashApplication:(id)sender {
NSLog(@"This should crash this application %@", 1234567890);
}
- (IBAction)RemoveLastDate:(id)sender {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:MGMGRLastCrashDate];
}
- (IBAction)RemoveSendAll:(id)sender {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:MGMGRSendAll];
}
- (IBAction)RemoveIgnoreAll:(id)sender {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:MGMGRIgnoreAll];
}
@end

50
GeckoReporter Test-Info.plist

@ -0,0 +1,50 @@
<?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>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>GeckoReporter</string>
<key>CFBundleIdentifier</key>
<string>com.MrGeckosMedia.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright 2010 by Mr. Gecko&apos;s Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/</string>
<key>CFBundleShortVersionString</key>
<string>0.1</string>
<key>CFBundleVersion</key>
<string>0.1</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>MGMGRCrashEmail</key>
<string>crashreports@mrgeckosmedia.com</string>
<key>MGMGRBugsEmail</key>
<string>bugs@mrgeckosmedia.com</string>
<key>MGMGRContactEmail</key>
<string>support@mrgeckosmedia.com</string>
<key>MGMGRLogFiles</key>
<string>~/Library/Logs/com.MrGeckosMedia.${PRODUCT_NAME:rfc1034identifier}.log ~/Library/Logs/com.MrGeckosMedia.${PRODUCT_NAME:rfc1034identifier}_2.log</string>
<key>MGMGRReportFileAttached</key>
<true/>
<key>MGMGRTimeFormat</key>
<string>%A, %m/%d/%y %I:%M:%S %p</string>
<key>MGMGRTimeZone</key>
<string>CST</string>
<key>MGMGRURL</key>
<string>https://mrgeckosmedia.com/sendreport.php</string>
</dict>
</plist>

30
GeckoReporter-Info.plist

@ -0,0 +1,30 @@
<?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>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.MrGeckosMedia.${PRODUCT_NAME:rfc1034Identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright 2010 by Mr. Gecko&apos;s Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/</string>
<key>CFBundleVersion</key>
<string>0.1</string>
<key>CFBundleShortVersionString</key>
<string>0.1</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

7376
GeckoReporter.ai
File diff suppressed because it is too large
View File

BIN
GeckoReporter.icns

601
GeckoReporter.xcodeproj/grmrgecko.pbxuser

@ -0,0 +1,601 @@
// !$*UTF8*$!
{
0867D690FE84028FC02AAC07 /* Project object */ = {
activeBuildConfigurationName = Release;
activeExecutable = 2AC86A0C10EE8C12000743D2 /* GeckoReporter Test */;
activeTarget = 2AC86A0A10EE8C12000743D2 /* GeckoReporter Test */;
addToTargets = (
8DC2EF4F0486A6940098B216 /* GeckoReporter */,
);
breakpoints = (
);
codeSenseManager = 2A478DA210E8456500EBC4A9 /* Code sense */;
executables = (
2AC86A0C10EE8C12000743D2 /* GeckoReporter Test */,
);
perUserDictionary = {
"PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = {
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
20,
198,
20,
99,
99,
29,
20,
);
PBXFileTableDataSourceColumnsKey = (
PBXBreakpointsDataSource_ActionID,
PBXBreakpointsDataSource_TypeID,
PBXBreakpointsDataSource_BreakpointID,
PBXBreakpointsDataSource_UseID,
PBXBreakpointsDataSource_LocationID,
PBXBreakpointsDataSource_ConditionID,
PBXBreakpointsDataSource_IgnoreCountID,
PBXBreakpointsDataSource_ContinueID,
);
};
"PBXConfiguration.PBXBreakpointsDataSource.v1:1CA23EDF0692099D00951B8B" = {
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
20,
329,
20,
229,
229,
157,
20,
);
PBXFileTableDataSourceColumnsKey = (
PBXBreakpointsDataSource_ActionID,
PBXBreakpointsDataSource_TypeID,
PBXBreakpointsDataSource_BreakpointID,
PBXBreakpointsDataSource_UseID,
PBXBreakpointsDataSource_LocationID,
PBXBreakpointsDataSource_ConditionID,
PBXBreakpointsDataSource_IgnoreCountID,
PBXBreakpointsDataSource_ContinueID,
);
};
PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;
PBXFileTableDataSourceColumnWidthsKey = (
22,
300,
722,
);
PBXFileTableDataSourceColumnsKey = (
PBXExecutablesDataSource_ActiveFlagID,
PBXExecutablesDataSource_NameID,
PBXExecutablesDataSource_CommentsID,
);
};
PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
834,
20,
48,
43,
43,
20,
);
PBXFileTableDataSourceColumnsKey = (
PBXFileDataSource_FiletypeID,
PBXFileDataSource_Filename_ColumnID,
PBXFileDataSource_Built_ColumnID,
PBXFileDataSource_ObjectSize_ColumnID,
PBXFileDataSource_Errors_ColumnID,
PBXFileDataSource_Warnings_ColumnID,
PBXFileDataSource_Target_ColumnID,
);
};
PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = {
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID;
PBXFileTableDataSourceColumnWidthsKey = (
16,
200,
50,
774,
);
PBXFileTableDataSourceColumnsKey = (
PBXSymbolsDataSource_SymbolTypeIconID,
PBXSymbolsDataSource_SymbolNameID,
PBXSymbolsDataSource_SymbolTypeID,
PBXSymbolsDataSource_ReferenceNameID,
);
};
PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
PBXFileTableDataSourceColumnSortingDirectionKey = 1;
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
794,
60,
20,
48,
43,
43,
);
PBXFileTableDataSourceColumnsKey = (
PBXFileDataSource_FiletypeID,
PBXFileDataSource_Filename_ColumnID,
PBXTargetDataSource_PrimaryAttribute,
PBXFileDataSource_Built_ColumnID,
PBXFileDataSource_ObjectSize_ColumnID,
PBXFileDataSource_Errors_ColumnID,
PBXFileDataSource_Warnings_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 284508832;
PBXWorkspaceStateSaveDate = 284508832;
};
perUserProjectItems = {
2A85029A10F05D6B00CA1273 = 2A85029A10F05D6B00CA1273 /* PBXTextBookmark */;
2AB297B910F51A920080C6A1 = 2AB297B910F51A920080C6A1 /* PBXTextBookmark */;
2AB297E110F5428A0080C6A1 = 2AB297E110F5428A0080C6A1 /* PBXTextBookmark */;
2AB297F610F542DF0080C6A1 /* PBXTextBookmark */ = 2AB297F610F542DF0080C6A1 /* PBXTextBookmark */;
2AB2988010F5537F0080C6A1 /* PBXBookmark */ = 2AB2988010F5537F0080C6A1 /* PBXBookmark */;
2AB2988E10F5590F0080C6A1 /* PBXTextBookmark */ = 2AB2988E10F5590F0080C6A1 /* PBXTextBookmark */;
2AB2989710F5590F0080C6A1 /* PBXTextBookmark */ = 2AB2989710F5590F0080C6A1 /* PBXTextBookmark */;
2AB2989A10F5590F0080C6A1 /* PBXTextBookmark */ = 2AB2989A10F5590F0080C6A1 /* PBXTextBookmark */;
2AB2989C10F5590F0080C6A1 /* PBXTextBookmark */ = 2AB2989C10F5590F0080C6A1 /* PBXTextBookmark */;
2AB298A510F55CBA0080C6A1 /* PBXTextBookmark */ = 2AB298A510F55CBA0080C6A1 /* PBXTextBookmark */;
2AB298A610F55CBA0080C6A1 /* PBXTextBookmark */ = 2AB298A610F55CBA0080C6A1 /* PBXTextBookmark */;
2AB298A710F55CBA0080C6A1 /* PBXTextBookmark */ = 2AB298A710F55CBA0080C6A1 /* PBXTextBookmark */;
};
sourceControlManager = 2A478DA110E8456500EBC4A9 /* Source Control */;
userBuildSettings = {
};
};
2A478DA110E8456500EBC4A9 /* Source Control */ = {
isa = PBXSourceControlManager;
fallbackIsa = XCSourceControlManager;
isSCMEnabled = 0;
scmConfiguration = {
repositoryNamesForRoots = {
"" = "";
};
};
};
2A478DA210E8456500EBC4A9 /* Code sense */ = {
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
2A85014210EFA6A700CA1273 /* MGMFeedback.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{181, 0}";
sepNavVisRange = "{0, 329}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2A85014310EFA6A700CA1273 /* MGMFeedback.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{181, 0}";
sepNavVisRange = "{0, 424}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2A85014710EFA81C00CA1273 /* MGMBugWindow.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{182, 0}";
sepNavVisRange = "{0, 617}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2A85014810EFA81C00CA1273 /* MGMBugWindow.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1012, 1092}}";
sepNavSelRange = "{2035, 0}";
sepNavVisRange = "{0, 0}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2A85029A10F05D6B00CA1273 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2AC86CD710EEC2B4000743D2 /* NSThread.h */;
name = "NSThread.h: 9";
rLen = 3;
rLoc = 180;
rType = 0;
vrLen = 0;
vrLoc = 0;
};
2A8502FC10F0636600CA1273 /* MGMSenderDelegate.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{187, 0}";
sepNavVisRange = "{0, 340}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB2902810F132290080C6A1 /* MGMContactWindow.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{186, 0}";
sepNavVisRange = "{0, 669}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB2902910F132290080C6A1 /* MGMContactWindow.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 1196}}";
sepNavSelRange = "{1530, 13}";
sepNavVisRange = "{941, 1725}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB2922C10F17A950080C6A1 /* GeckoReporter-Info.plist */ = {
uiCtxt = {
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB297B910F51A920080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2A85014810EFA81C00CA1273 /* MGMBugWindow.m */;
name = "MGMBugWindow.m: 80";
rLen = 0;
rLoc = 2035;
rType = 0;
vrLen = 0;
vrLoc = 0;
};
2AB297E110F5428A0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2A85014810EFA81C00CA1273 /* MGMBugWindow.m */;
name = "MGMBugWindow.m: 80";
rLen = 0;
rLoc = 2035;
rType = 0;
vrLen = 0;
vrLoc = 0;
};
2AB297F610F542DF0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2A85014810EFA81C00CA1273 /* MGMBugWindow.m */;
name = "MGMBugWindow.m: 80";
rLen = 0;
rLoc = 2035;
rType = 0;
vrLen = 0;
vrLoc = 0;
};
2AB2983210F54BA00080C6A1 /* English */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {2973, 646}}";
sepNavSelRange = "{0, 0}";
sepNavVisRange = "{0, 2172}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB2984D10F54BB40080C6A1 /* pt_PT */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1601, 646}}";
sepNavSelRange = "{1209, 0}";
sepNavVisRange = "{0, 1212}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB2985110F54C1E0080C6A1 /* es */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1524, 646}}";
sepNavSelRange = "{1160, 0}";
sepNavVisRange = "{0, 1163}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB2985C10F54D490080C6A1 /* MGMLocalized.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{316, 34}";
sepNavVisRange = "{0, 399}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AB2987E10F5537D0080C6A1 /* License.txt */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{670, 0}";
sepNavVisRange = "{0, 1229}";
};
};
2AB2988010F5537F0080C6A1 /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 2AB2987E10F5537D0080C6A1 /* License.txt */;
};
2AB2988E10F5590F0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2A85014810EFA81C00CA1273 /* MGMBugWindow.m */;
name = "MGMBugWindow.m: 80";
rLen = 0;
rLoc = 2035;
rType = 0;
vrLen = 0;
vrLoc = 0;
};
2AB2989710F5590F0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2AB2987E10F5537D0080C6A1 /* License.txt */;
name = "License.txt: 11";
rLen = 0;
rLoc = 670;
rType = 0;
vrLen = 1229;
vrLoc = 0;
};
2AB2989A10F5590F0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2AB2989B10F5590F0080C6A1 /* Sparkle.strings */;
rLen = 0;
rLoc = 2147483647;
rType = 0;
};
2AB2989B10F5590F0080C6A1 /* Sparkle.strings */ = {
isa = PBXFileReference;
lastKnownFileType = text.plist.strings;
name = Sparkle.strings;
path = "/Users/grmrgecko/Downloads/Sparkle 1.5b6/Extras/Source Code/en.lproj/Sparkle.strings";
sourceTree = "<absolute>";
};
2AB2989C10F5590F0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2AB2989D10F5590F0080C6A1 /* Sparkle.strings */;
name = "Sparkle.strings: 1";
rLen = 0;
rLoc = 0;
rType = 0;
vrLen = 2737;
vrLoc = 0;
};
2AB2989D10F5590F0080C6A1 /* Sparkle.strings */ = {
isa = PBXFileReference;
name = Sparkle.strings;
path = "/Users/grmrgecko/Downloads/Sparkle 1.5b6/Extras/Source Code/en.lproj/Sparkle.strings";
sourceTree = "<absolute>";
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {2588, 1105}}";
sepNavSelRange = "{0, 0}";
sepNavVisRange = "{0, 2737}";
};
};
2AB298A510F55CBA0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2A85014810EFA81C00CA1273 /* MGMBugWindow.m */;
name = "MGMBugWindow.m: 80";
rLen = 0;
rLoc = 2035;
rType = 0;
vrLen = 0;
vrLoc = 0;
};
2AB298A610F55CBA0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2AB2987E10F5537D0080C6A1 /* License.txt */;
name = "License.txt: 11";
rLen = 0;
rLoc = 670;
rType = 0;
vrLen = 1229;
vrLoc = 0;
};
2AB298A710F55CBA0080C6A1 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2AB2989D10F5590F0080C6A1 /* Sparkle.strings */;
name = "Sparkle.strings: 1";
rLen = 0;
rLoc = 0;
rType = 0;
vrLen = 2737;
vrLoc = 0;
};
2AC8693C10EE7EDE000743D2 /* Prefix.pch */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{0, 187}";
sepNavVisRange = "{0, 241}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8694A10EE8062000743D2 /* GeckoReporter.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{75, 2}";
sepNavVisRange = "{0, 280}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8694B10EE8062000743D2 /* MGMReporter.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{183, 0}";
sepNavVisRange = "{0, 632}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8694C10EE8062000743D2 /* MGMReporter.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 1495}}";
sepNavSelRange = "{183, 0}";
sepNavVisRange = "{0, 1845}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8694D10EE8062000743D2 /* MGMReportWindow.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{187, 0}";
sepNavVisRange = "{0, 1200}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8694E10EE8062000743D2 /* MGMReportWindow.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1475, 1807}}";
sepNavSelRange = "{3461, 13}";
sepNavVisRange = "{2748, 2013}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8694F10EE8062000743D2 /* MGMSender.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{181, 0}";
sepNavVisRange = "{0, 716}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8695110EE8062000743D2 /* MGMSystemInfo.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{185, 0}";
sepNavVisRange = "{0, 880}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC8695210EE8062000743D2 /* MGMSystemInfo.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 3224}}";
sepNavSelRange = "{86, 99}";
sepNavVisRange = "{0, 1448}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC869AD10EE82B3000743D2 /* English */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{44, 0}";
sepNavVisRange = "{0, 44}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC869AF10EE82CF000743D2 /* GeckoReporter Test-Info.plist */ = {
uiCtxt = {
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC869B510EE83C3000743D2 /* MGMController.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{183, 0}";
sepNavVisRange = "{0, 472}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC869B610EE83C3000743D2 /* MGMController.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{183, 0}";
sepNavVisRange = "{0, 989}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC86A0A10EE8C12000743D2 /* GeckoReporter Test */ = {
activeExec = 0;
executables = (
2AC86A0C10EE8C12000743D2 /* GeckoReporter Test */,
);
};
2AC86A0C10EE8C12000743D2 /* GeckoReporter Test */ = {
isa = PBXExecutable;
activeArgIndices = (
);
argumentStrings = (
);
autoAttachOnCrash = 1;
breakpointsEnabled = 0;
configStateDict = {
};
customDataFormattersEnabled = 1;
dataTipCustomDataFormattersEnabled = 1;
dataTipShowTypeColumn = 1;
dataTipSortType = 0;
debuggerPlugin = GDBDebugging;
disassemblyDisplayState = 0;
dylibVariantSuffix = "";
enableDebugStr = 1;
environmentEntries = (
);
executableSystemSymbolLevel = 0;
executableUserSymbolLevel = 0;
libgmallocEnabled = 0;
name = "GeckoReporter Test";
savedGlobals = {
};
showTypeColumn = 0;
sourceDirectories = (
);
variableFormatDictionary = {
$cs = 1;
$ds = 1;
$eax = 1;
$ebp = 1;
$ebx = 1;
$ecx = 1;
$edi = 1;
$edx = 1;
$eflags = 1;
$eip = 1;
$es = 1;
$esi = 1;
$esp = 1;
$fs = 1;
$gs = 1;
$mxcsr = 1;
$ss = 1;
};
};
2AC86A9C10EE9149000743D2 /* main.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{227, 0}";
sepNavVisRange = "{0, 254}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC86B4510EE9DD7000743D2 /* MGMLog.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 646}}";
sepNavSelRange = "{176, 0}";
sepNavVisRange = "{0, 287}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC86B4610EE9DD7000743D2 /* MGMLog.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 1196}}";
sepNavSelRange = "{176, 0}";
sepNavVisRange = "{0, 1785}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
2AC86CD710EEC2B4000743D2 /* NSThread.h */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.h;
name = NSThread.h;
path = /Users/grmrgecko/Desktop/AppKit/NSThread.h;
sourceTree = "<absolute>";
};
2AC86CF010EEC54C000743D2 /* MGMSender.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1176, 5239}}";
sepNavSelRange = "{706, 0}";
sepNavVisRange = "{0, 1732}";
sepNavWindowFrame = "{{15, 4}, {1235, 774}}";
};
};
8DC2EF4F0486A6940098B216 /* GeckoReporter */ = {
activeExec = 0;
};
}

1603
GeckoReporter.xcodeproj/grmrgecko.perspectivev3
File diff suppressed because it is too large
View File

654
GeckoReporter.xcodeproj/project.pbxproj

@ -0,0 +1,654 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
/* Begin PBXBuildFile section */
2A85014410EFA6A700CA1273 /* MGMFeedback.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A85014210EFA6A700CA1273 /* MGMFeedback.h */; settings = {ATTRIBUTES = (Public, ); }; };
2A85014510EFA6A700CA1273 /* MGMFeedback.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A85014310EFA6A700CA1273 /* MGMFeedback.m */; };
2A85014910EFA81C00CA1273 /* MGMBugWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A85014710EFA81C00CA1273 /* MGMBugWindow.h */; settings = {ATTRIBUTES = (Private, ); }; };
2A85014A10EFA81C00CA1273 /* MGMBugWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A85014810EFA81C00CA1273 /* MGMBugWindow.m */; };
2A8502FD10F0636600CA1273 /* MGMSenderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A8502FC10F0636600CA1273 /* MGMSenderDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
2AB2902A10F132290080C6A1 /* MGMContactWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AB2902810F132290080C6A1 /* MGMContactWindow.h */; settings = {ATTRIBUTES = (Private, ); }; };
2AB2902B10F132290080C6A1 /* MGMContactWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB2902910F132290080C6A1 /* MGMContactWindow.m */; };
2AB297AF10F51A070080C6A1 /* GeckoReporter.icns in Resources */ = {isa = PBXBuildFile; fileRef = 2AB297A510F5173F0080C6A1 /* GeckoReporter.icns */; };
2AB2984610F54BA00080C6A1 /* GeckoReporter.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2AB2983110F54BA00080C6A1 /* GeckoReporter.strings */; };
2AB2984910F54BA00080C6A1 /* MGMBugWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AB2983710F54BA00080C6A1 /* MGMBugWindow.xib */; };
2AB2984A10F54BA00080C6A1 /* MGMContactWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AB2983910F54BA00080C6A1 /* MGMContactWindow.xib */; };
2AB2984B10F54BA00080C6A1 /* MGMReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AB2983B10F54BA00080C6A1 /* MGMReportWindow.xib */; };
2AB2984C10F54BA00080C6A1 /* ModelNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2AB2984110F54BA00080C6A1 /* ModelNames.plist */; };
2AB2985D10F54D490080C6A1 /* MGMLocalized.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AB2985C10F54D490080C6A1 /* MGMLocalized.h */; settings = {ATTRIBUTES = (Private, ); }; };
2AB2987F10F5537D0080C6A1 /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 2AB2987E10F5537D0080C6A1 /* License.txt */; };
2AC8695410EE8062000743D2 /* GeckoReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AC8694A10EE8062000743D2 /* GeckoReporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
2AC8695510EE8062000743D2 /* MGMReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AC8694B10EE8062000743D2 /* MGMReporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
2AC8695610EE8062000743D2 /* MGMReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC8694C10EE8062000743D2 /* MGMReporter.m */; };
2AC8695710EE8062000743D2 /* MGMReportWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AC8694D10EE8062000743D2 /* MGMReportWindow.h */; settings = {ATTRIBUTES = (Private, ); }; };
2AC8695810EE8062000743D2 /* MGMReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC8694E10EE8062000743D2 /* MGMReportWindow.m */; };
2AC8695910EE8062000743D2 /* MGMSender.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AC8694F10EE8062000743D2 /* MGMSender.h */; settings = {ATTRIBUTES = (Public, ); }; };
2AC8695B10EE8062000743D2 /* MGMSystemInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AC8695110EE8062000743D2 /* MGMSystemInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
2AC8695C10EE8062000743D2 /* MGMSystemInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC8695210EE8062000743D2 /* MGMSystemInfo.m */; };
2AC869B410EE839E000743D2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AC869B310EE839E000743D2 /* MainMenu.xib */; };
2AC86A0F10EE8C1F000743D2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2AC869AC10EE82B3000743D2 /* InfoPlist.strings */; };
2AC86A1010EE8C1F000743D2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AC869B310EE839E000743D2 /* MainMenu.xib */; };
2AC86A1210EE8C2B000743D2 /* MGMController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC869B610EE83C3000743D2 /* MGMController.m */; };
2AC86A7410EE901F000743D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; };
2AC86A7510EE902E000743D2 /* GeckoReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* GeckoReporter.framework */; };
2AC86A7810EE9053000743D2 /* GeckoReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* GeckoReporter.framework */; };
2AC86A9D10EE9149000743D2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC86A9C10EE9149000743D2 /* main.m */; };
2AC86B4710EE9DD7000743D2 /* MGMLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AC86B4510EE9DD7000743D2 /* MGMLog.h */; settings = {ATTRIBUTES = (Public, ); }; };
2AC86B4810EE9DD7000743D2 /* MGMLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC86B4610EE9DD7000743D2 /* MGMLog.m */; };
2AC86CF110EEC54C000743D2 /* MGMSender.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC86CF010EEC54C000743D2 /* MGMSender.m */; };
8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
2AC86A7610EE9049000743D2 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
remoteInfo = GeckoReporter;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
2AC86A1710EE8C7C000743D2 /* Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
2AC86A7510EE902E000743D2 /* GeckoReporter.framework in Frameworks */,
);
name = Frameworks;
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
2A85014210EFA6A700CA1273 /* MGMFeedback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMFeedback.h; sourceTree = "<group>"; };
2A85014310EFA6A700CA1273 /* MGMFeedback.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMFeedback.m; sourceTree = "<group>"; };
2A85014710EFA81C00CA1273 /* MGMBugWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMBugWindow.h; sourceTree = "<group>"; };
2A85014810EFA81C00CA1273 /* MGMBugWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMBugWindow.m; sourceTree = "<group>"; };
2A8502FC10F0636600CA1273 /* MGMSenderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMSenderDelegate.h; sourceTree = "<group>"; };
2AB2902810F132290080C6A1 /* MGMContactWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMContactWindow.h; sourceTree = "<group>"; };
2AB2902910F132290080C6A1 /* MGMContactWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMContactWindow.m; sourceTree = "<group>"; };
2AB2922C10F17A950080C6A1 /* GeckoReporter-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GeckoReporter-Info.plist"; sourceTree = SOURCE_ROOT; };
2AB2927710F184CC0080C6A1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = pt_PT.lproj/MainMenu.xib; sourceTree = "<group>"; };
2AB2977210F50BB80080C6A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/MainMenu.xib; sourceTree = "<group>"; };
2AB297A510F5173F0080C6A1 /* GeckoReporter.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = GeckoReporter.icns; sourceTree = SOURCE_ROOT; };
2AB2983210F54BA00080C6A1 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/GeckoReporter.strings; sourceTree = "<group>"; };
2AB2983810F54BA00080C6A1 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MGMBugWindow.xib; sourceTree = "<group>"; };
2AB2983A10F54BA00080C6A1 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MGMContactWindow.xib; sourceTree = "<group>"; };
2AB2983C10F54BA00080C6A1 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MGMReportWindow.xib; sourceTree = "<group>"; };
2AB2983E10F54BA00080C6A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/MGMBugWindow.xib; sourceTree = "<group>"; };
2AB2983F10F54BA00080C6A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/MGMContactWindow.xib; sourceTree = "<group>"; };
2AB2984010F54BA00080C6A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/MGMReportWindow.xib; sourceTree = "<group>"; };
2AB2984110F54BA00080C6A1 /* ModelNames.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ModelNames.plist; sourceTree = "<group>"; };
2AB2984310F54BA00080C6A1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = pt_PT.lproj/MGMBugWindow.xib; sourceTree = "<group>"; };
2AB2984410F54BA00080C6A1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = pt_PT.lproj/MGMContactWindow.xib; sourceTree = "<group>"; };
2AB2984510F54BA00080C6A1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = pt_PT.lproj/MGMReportWindow.xib; sourceTree = "<group>"; };
2AB2984D10F54BB40080C6A1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt_PT; path = pt_PT.lproj/GeckoReporter.strings; sourceTree = "<group>"; };
2AB2985110F54C1E0080C6A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/GeckoReporter.strings; sourceTree = "<group>"; };
2AB2985C10F54D490080C6A1 /* MGMLocalized.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMLocalized.h; sourceTree = "<group>"; };
2AB2987E10F5537D0080C6A1 /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = License.txt; sourceTree = SOURCE_ROOT; };
2AC8693C10EE7EDE000743D2 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; };
2AC8694A10EE8062000743D2 /* GeckoReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeckoReporter.h; sourceTree = "<group>"; };
2AC8694B10EE8062000743D2 /* MGMReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMReporter.h; sourceTree = "<group>"; };
2AC8694C10EE8062000743D2 /* MGMReporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMReporter.m; sourceTree = "<group>"; };
2AC8694D10EE8062000743D2 /* MGMReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMReportWindow.h; sourceTree = "<group>"; };
2AC8694E10EE8062000743D2 /* MGMReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMReportWindow.m; sourceTree = "<group>"; };
2AC8694F10EE8062000743D2 /* MGMSender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMSender.h; sourceTree = "<group>"; };
2AC8695110EE8062000743D2 /* MGMSystemInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMSystemInfo.h; sourceTree = "<group>"; };
2AC8695210EE8062000743D2 /* MGMSystemInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMSystemInfo.m; sourceTree = "<group>"; };
2AC869AD10EE82B3000743D2 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
2AC869AF10EE82CF000743D2 /* GeckoReporter Test-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GeckoReporter Test-Info.plist"; sourceTree = SOURCE_ROOT; };
2AC869B010EE82F1000743D2 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
2AC869B510EE83C3000743D2 /* MGMController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMController.h; sourceTree = "<group>"; };
2AC869B610EE83C3000743D2 /* MGMController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMController.m; sourceTree = "<group>"; };
2AC86A0B10EE8C12000743D2 /* GeckoReporter Test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GeckoReporter Test.app"; sourceTree = BUILT_PRODUCTS_DIR; };
2AC86A9C10EE9149000743D2 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
2AC86B4510EE9DD7000743D2 /* MGMLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMLog.h; sourceTree = "<group>"; };
2AC86B4610EE9DD7000743D2 /* MGMLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMLog.m; sourceTree = "<group>"; };
2AC86CF010EEC54C000743D2 /* MGMSender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMSender.m; sourceTree = "<group>"; };
8DC2EF5B0486A6940098B216 /* GeckoReporter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GeckoReporter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D2F7E79907B2D74100F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
2AC86A0910EE8C12000743D2 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2AC86A7810EE9053000743D2 /* GeckoReporter.framework in Frameworks */,
2AC86A7410EE901F000743D2 /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8DC2EF560486A6940098B216 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
034768DFFF38A50411DB9C8B /* Products */ = {
isa = PBXGroup;
children = (
8DC2EF5B0486A6940098B216 /* GeckoReporter.framework */,
2AC86A0B10EE8C12000743D2 /* GeckoReporter Test.app */,
);
name = Products;
sourceTree = "<group>";
};
0867D691FE84028FC02AAC07 /* GeckoReporter */ = {
isa = PBXGroup;
children = (
2AC8694810EE8062000743D2 /* Classes */,
32C88DFF0371C24200C91783 /* Other Sources */,
2AC8695D10EE808D000743D2 /* Resources */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
034768DFFF38A50411DB9C8B /* Products */,
);
name = GeckoReporter;
sourceTree = "<group>";
};
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */,
1058C7B2FEA5585E11CA2CBB /* Other Frameworks */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
};
1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */,
);
name = "Linked Frameworks";
sourceTree = "<group>";
};
1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = {
isa = PBXGroup;
children = (
0867D6A5FE840307C02AAC07 /* AppKit.framework */,
D2F7E79907B2D74100F64583 /* CoreData.framework */,
0867D69BFE84028FC02AAC07 /* Foundation.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
2AB2983010F54BA00080C6A1 /* Framework */ = {
isa = PBXGroup;
children = (
2AB2987E10F5537D0080C6A1 /* License.txt */,
2AB2922C10F17A950080C6A1 /* GeckoReporter-Info.plist */,
2AB2983110F54BA00080C6A1 /* GeckoReporter.strings */,
2AB2983710F54BA00080C6A1 /* MGMBugWindow.xib */,
2AB2983910F54BA00080C6A1 /* MGMContactWindow.xib */,
2AB2983B10F54BA00080C6A1 /* MGMReportWindow.xib */,
2AB2984110F54BA00080C6A1 /* ModelNames.plist */,
);
path = Framework;
sourceTree = "<group>";
};
2AC8694810EE8062000743D2 /* Classes */ = {
isa = PBXGroup;
children = (
2AC8694910EE8062000743D2 /* Framework */,
2AC8695310EE8062000743D2 /* Test */,
);
path = Classes;
sourceTree = "<group>";
};
2AC8694910EE8062000743D2 /* Framework */ = {
isa = PBXGroup;
children = (
2AC8694A10EE8062000743D2 /* GeckoReporter.h */,
2AC8694B10EE8062000743D2 /* MGMReporter.h */,
2AC8694C10EE8062000743D2 /* MGMReporter.m */,
2AC8694D10EE8062000743D2 /* MGMReportWindow.h */,
2AC8694E10EE8062000743D2 /* MGMReportWindow.m */,
2A85014210EFA6A700CA1273 /* MGMFeedback.h */,
2A85014310EFA6A700CA1273 /* MGMFeedback.m */,
2A85014710EFA81C00CA1273 /* MGMBugWindow.h */,
2A85014810EFA81C00CA1273 /* MGMBugWindow.m */,
2AB2902810F132290080C6A1 /* MGMContactWindow.h */,
2AB2902910F132290080C6A1 /* MGMContactWindow.m */,
2A8502FC10F0636600CA1273 /* MGMSenderDelegate.h */,
2AC8694F10EE8062000743D2 /* MGMSender.h */,
2AC86CF010EEC54C000743D2 /* MGMSender.m */,
2AC8695110EE8062000743D2 /* MGMSystemInfo.h */,
2AC8695210EE8062000743D2 /* MGMSystemInfo.m */,
2AC86B4510EE9DD7000743D2 /* MGMLog.h */,
2AC86B4610EE9DD7000743D2 /* MGMLog.m */,
2AB2985C10F54D490080C6A1 /* MGMLocalized.h */,
);
path = Framework;
sourceTree = "<group>";
};
2AC8695310EE8062000743D2 /* Test */ = {
isa = PBXGroup;
children = (
2AC869B510EE83C3000743D2 /* MGMController.h */,
2AC869B610EE83C3000743D2 /* MGMController.m */,
);
path = Test;
sourceTree = "<group>";
};
2AC8695D10EE808D000743D2 /* Resources */ = {
isa = PBXGroup;
children = (
2AB2983010F54BA00080C6A1 /* Framework */,
2AC869AB10EE82B3000743D2 /* Test */,
);
path = Resources;
sourceTree = "<group>";
};
2AC869AB10EE82B3000743D2 /* Test */ = {
isa = PBXGroup;
children = (
2AB297A510F5173F0080C6A1 /* GeckoReporter.icns */,
2AC869AF10EE82CF000743D2 /* GeckoReporter Test-Info.plist */,
2AC869AC10EE82B3000743D2 /* InfoPlist.strings */,
2AC869B310EE839E000743D2 /* MainMenu.xib */,
);
path = Test;
sourceTree = "<group>";
};
32C88DFF0371C24200C91783 /* Other Sources */ = {
isa = PBXGroup;
children = (
2AC8693C10EE7EDE000743D2 /* Prefix.pch */,
2AC86A9C10EE9149000743D2 /* main.m */,
);
name = "Other Sources";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
8DC2EF500486A6940098B216 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
2AC8695410EE8062000743D2 /* GeckoReporter.h in Headers */,
2AC8695510EE8062000743D2 /* MGMReporter.h in Headers */,
2AC8695710EE8062000743D2 /* MGMReportWindow.h in Headers */,
2AC8695910EE8062000743D2 /* MGMSender.h in Headers */,
2AC8695B10EE8062000743D2 /* MGMSystemInfo.h in Headers */,
2AC86B4710EE9DD7000743D2 /* MGMLog.h in Headers */,
2A85014410EFA6A700CA1273 /* MGMFeedback.h in Headers */,
2A85014910EFA81C00CA1273 /* MGMBugWindow.h in Headers */,
2A8502FD10F0636600CA1273 /* MGMSenderDelegate.h in Headers */,
2AB2902A10F132290080C6A1 /* MGMContactWindow.h in Headers */,
2AB2985D10F54D490080C6A1 /* MGMLocalized.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
2AC86A0A10EE8C12000743D2 /* GeckoReporter Test */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2AC86A1810EE8C7C000743D2 /* Build configuration list for PBXNativeTarget "GeckoReporter Test" */;
buildPhases = (
2AC86A0710EE8C12000743D2 /* Resources */,
2AC86A0810EE8C12000743D2 /* Sources */,
2AC86A0910EE8C12000743D2 /* Frameworks */,
2AC86A1710EE8C7C000743D2 /* Frameworks */,
);
buildRules = (
);
dependencies = (
2AC86A7710EE9049000743D2 /* PBXTargetDependency */,
);
name = "GeckoReporter Test";
productName = "GeckoReporter Test";
productReference = 2AC86A0B10EE8C12000743D2 /* GeckoReporter Test.app */;
productType = "com.apple.product-type.application";
};
8DC2EF4F0486A6940098B216 /* GeckoReporter */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "GeckoReporter" */;
buildPhases = (
8DC2EF500486A6940098B216 /* Headers */,
8DC2EF520486A6940098B216 /* Resources */,
8DC2EF540486A6940098B216 /* Sources */,
8DC2EF560486A6940098B216 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = GeckoReporter;
productInstallPath = "$(HOME)/Library/Frameworks";
productName = GeckoReporter;
productReference = 8DC2EF5B0486A6940098B216 /* GeckoReporter.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "GeckoReporter" */;
compatibilityVersion = "Xcode 3.1";
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
"pt-PT",
pt_PT,
es,
);
mainGroup = 0867D691FE84028FC02AAC07 /* GeckoReporter */;
productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
8DC2EF4F0486A6940098B216 /* GeckoReporter */,
2AC86A0A10EE8C12000743D2 /* GeckoReporter Test */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
2AC86A0710EE8C12000743D2 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2AB297AF10F51A070080C6A1 /* GeckoReporter.icns in Resources */,
2AC86A0F10EE8C1F000743D2 /* InfoPlist.strings in Resources */,
2AC86A1010EE8C1F000743D2 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8DC2EF520486A6940098B216 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2AC869B410EE839E000743D2 /* MainMenu.xib in Resources */,
2AB2984610F54BA00080C6A1 /* GeckoReporter.strings in Resources */,
2AB2984910F54BA00080C6A1 /* MGMBugWindow.xib in Resources */,
2AB2984A10F54BA00080C6A1 /* MGMContactWindow.xib in Resources */,
2AB2984B10F54BA00080C6A1 /* MGMReportWindow.xib in Resources */,
2AB2984C10F54BA00080C6A1 /* ModelNames.plist in Resources */,
2AB2987F10F5537D0080C6A1 /* License.txt in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
2AC86A0810EE8C12000743D2 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2AC86A9D10EE9149000743D2 /* main.m in Sources */,
2AC86A1210EE8C2B000743D2 /* MGMController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8DC2EF540486A6940098B216 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2AC8695610EE8062000743D2 /* MGMReporter.m in Sources */,
2AC8695810EE8062000743D2 /* MGMReportWindow.m in Sources */,
2AC8695C10EE8062000743D2 /* MGMSystemInfo.m in Sources */,
2AC86B4810EE9DD7000743D2 /* MGMLog.m in Sources */,
2AC86CF110EEC54C000743D2 /* MGMSender.m in Sources */,
2A85014510EFA6A700CA1273 /* MGMFeedback.m in Sources */,
2A85014A10EFA81C00CA1273 /* MGMBugWindow.m in Sources */,
2AB2902B10F132290080C6A1 /* MGMContactWindow.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
2AC86A7710EE9049000743D2 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 8DC2EF4F0486A6940098B216 /* GeckoReporter */;
targetProxy = 2AC86A7610EE9049000743D2 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
2AB2983110F54BA00080C6A1 /* GeckoReporter.strings */ = {
isa = PBXVariantGroup;
children = (
2AB2983210F54BA00080C6A1 /* English */,
2AB2984D10F54BB40080C6A1 /* pt_PT */,
2AB2985110F54C1E0080C6A1 /* es */,
);
name = GeckoReporter.strings;
sourceTree = "<group>";
};
2AB2983710F54BA00080C6A1 /* MGMBugWindow.xib */ = {
isa = PBXVariantGroup;
children = (
2AB2983810F54BA00080C6A1 /* English */,
2AB2983E10F54BA00080C6A1 /* es */,
2AB2984310F54BA00080C6A1 /* pt_PT */,
);
name = MGMBugWindow.xib;
sourceTree = "<group>";
};
2AB2983910F54BA00080C6A1 /* MGMContactWindow.xib */ = {
isa = PBXVariantGroup;
children = (
2AB2983A10F54BA00080C6A1 /* English */,
2AB2983F10F54BA00080C6A1 /* es */,
2AB2984410F54BA00080C6A1 /* pt_PT */,
);
name = MGMContactWindow.xib;
sourceTree = "<group>";
};
2AB2983B10F54BA00080C6A1 /* MGMReportWindow.xib */ = {
isa = PBXVariantGroup;
children = (
2AB2983C10F54BA00080C6A1 /* English */,
2AB2984010F54BA00080C6A1 /* es */,
2AB2984510F54BA00080C6A1 /* pt_PT */,
);
name = MGMReportWindow.xib;
sourceTree = "<group>";
};
2AC869AC10EE82B3000743D2 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
2AC869AD10EE82B3000743D2 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
2AC869B310EE839E000743D2 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
2AC869B010EE82F1000743D2 /* English */,
2AB2927710F184CC0080C6A1 /* pt_PT */,
2AB2977210F50BB80080C6A1 /* es */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
1DEB91AE08733DA50010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COPY_PHASE_STRIP = NO;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
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 = Prefix.pch;
GCC_VERSION = 4.0;
INFOPLIST_FILE = "GeckoReporter-Info.plist";
INSTALL_PATH = "@executable_path/../Frameworks";
PRODUCT_NAME = GeckoReporter;
SDKROOT = macosx10.4;
"SDKROOT[arch=*]" = macosx10.5;
SKIP_INSTALL = YES;
WRAPPER_EXTENSION = framework;
};
name = Debug;
};
1DEB91AF08733DA50010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = Prefix.pch;
GCC_VERSION = 4.0;
INFOPLIST_FILE = "GeckoReporter-Info.plist";
INSTALL_PATH = "@executable_path/../Frameworks";
PRODUCT_NAME = GeckoReporter;
SDKROOT = macosx10.4;
"SDKROOT[arch=x86_64]" = macosx10.5;
SKIP_INSTALL = YES;
WRAPPER_EXTENSION = framework;
};
name = Release;
};
1DEB91B208733DA50010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
SDKROOT = macosx10.6;
};
name = Debug;
};
1DEB91B308733DA50010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
SDKROOT = macosx10.6;
};
name = Release;
};
2AC86A0D10EE8C13000743D2 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COPY_PHASE_STRIP = NO;
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 = Prefix.pch;
GCC_VERSION = 4.0;
INFOPLIST_FILE = "GeckoReporter Test-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
OTHER_LDFLAGS = (
"-framework",
Foundation,
"-framework",
AppKit,
);
PREBINDING = NO;
PRODUCT_NAME = "GeckoReporter Test";
SDKROOT = macosx10.4;
"SDKROOT[arch=*]" = macosx10.5;
};
name = Debug;
};
2AC86A0E10EE8C13000743D2 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = Prefix.pch;
GCC_VERSION = 4.0;
INFOPLIST_FILE = "GeckoReporter Test-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
OTHER_LDFLAGS = (
"-framework",
Foundation,
"-framework",
AppKit,
);
PREBINDING = NO;
PRODUCT_NAME = "GeckoReporter Test";
SDKROOT = macosx10.4;
"SDKROOT[arch=x86_64]" = macosx10.5;
ZERO_LINK = NO;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "GeckoReporter" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB91AE08733DA50010E9CD /* Debug */,
1DEB91AF08733DA50010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "GeckoReporter" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB91B208733DA50010E9CD /* Debug */,
1DEB91B308733DA50010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
2AC86A1810EE8C7C000743D2 /* Build configuration list for PBXNativeTarget "GeckoReporter Test" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2AC86A0D10EE8C13000743D2 /* Debug */,
2AC86A0E10EE8C13000743D2 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
}

22
License.txt

@ -0,0 +1,22 @@
Copyright 2010 by 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 WILL MOST LIKELY BE WILLING TO HELP YOU
GET YOUR SOFTWARE/FRAMEWORK/COMPUTER WORKING AGAIN.
3. Redistributions of source code included in this framework must retain the
copyright notice on top of this License file without modifications.
4. If you use the crash reporter in this framework, it must retain the NSTextField
with the string "GeckoReporter by Mr. Gecko's Media" without modifications.
5. For the users convenience, you must retain the notice about anonymous system
information being sent.

13
Prefix.pch

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

15
ReadMe.txt

@ -0,0 +1,15 @@
Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
Documentation is on my todo list.
List of info.plist properties that can also be put into the NSUserDefaults.
MGMGRCrashEmail - The email address crash reports are sent to.
MGMGRBugsEmail - The email address bug reports are sent to. (If blank, bug reports are sent to the crash report email address.)
MGMGRContactEmail - The email address messages from contact me are sent to. (If blank, bug reports are sent to the bug report email address.)
MGMGRLogFiles - Log files of your application to be sent when a crash report is sent.
MGMGRReportFileAttached - If YES then crash reports are attached, if NO then crash reports are in the message.
MGMGRTimeFormat - The time format for crash report date. (http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/DataFormatting/Articles/df100103.html)
MGMGRTimeZone - The time zone you would like the crash report date to show in.
MGMGRURL - If you do not trust my server, you can host the php file copied from my server to you own and modify it.
Please send patches to support@mrgeckosmedia.com and I'll over view it and include credit to your fixes as needed.

BIN
Resources/Framework/English.lproj/GeckoReporter.strings

1414
Resources/Framework/English.lproj/MGMBugWindow.xib
File diff suppressed because it is too large
View File

1442
Resources/Framework/English.lproj/MGMContactWindow.xib
File diff suppressed because it is too large
View File

2846
Resources/Framework/English.lproj/MGMReportWindow.xib
File diff suppressed because it is too large
View File

206
Resources/Framework/ModelNames.plist

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

BIN
Resources/Framework/es.lproj/GeckoReporter.strings

1414
Resources/Framework/es.lproj/MGMBugWindow.xib
File diff suppressed because it is too large
View File

1442
Resources/Framework/es.lproj/MGMContactWindow.xib
File diff suppressed because it is too large
View File

2847
Resources/Framework/es.lproj/MGMReportWindow.xib
File diff suppressed because it is too large
View File

BIN
Resources/Framework/pt_PT.lproj/GeckoReporter.strings

1414
Resources/Framework/pt_PT.lproj/MGMBugWindow.xib
File diff suppressed because it is too large
View File

1442
Resources/Framework/pt_PT.lproj/MGMContactWindow.xib
File diff suppressed because it is too large
View File

2846
Resources/Framework/pt_PT.lproj/MGMReportWindow.xib
File diff suppressed because it is too large
View File

1
Resources/Test/English.lproj/InfoPlist.strings

@ -0,0 +1 @@
/* Localized versions of Info.plist keys */

4399
Resources/Test/English.lproj/MainMenu.xib
File diff suppressed because it is too large
View File

4399
Resources/Test/es.lproj/MainMenu.xib
File diff suppressed because it is too large
View File

4399
Resources/Test/pt_PT.lproj/MainMenu.xib
File diff suppressed because it is too large
View File

13
main.m

@ -0,0 +1,13 @@
//
// main.m
// GeckoReporter
//
// Created by Mr. Gecko on 1/1/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);
}

174
sendreport.php

@ -0,0 +1,174 @@
<?php
/*
* sendreport.php
* GeckoReporter
*
* Created by Mr. Gecko on 12/28/09.
* Copyright 2010 by Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
*
*/
//Debug
//print_r($_FILES);
//print_r($_POST);
function buildBody($FILES, $BOUNDARY) {
$BODY = "\n\r\n";
$KEYS = array_keys($FILES);
for ($i=0; $i<count($KEYS); $i++) {
$KEY = $KEYS[$i];
$FILE = $_FILES[$KEY]['tmp_name'];
$FILENAME = $_FILES[$KEY]['name'];
$FILETYPE = $_FILES[$KEY]['type'];
$FILESIZE = $_FILES[$KEY]['size'];
$BODY .= "--$BOUNDARY\r\n";
$BODY .= "Content-Disposition: attachment; filename=\"{$FILENAME}\"\r\n";
$BODY .= "Content-Type: {$FILETYPE} name=\"{$FILENAME}\"\r\n";
$BODY .= "Content-Transfer-Encoding: binary\r\n\r\n";
$FILEPIPE = fopen($FILE, "r");
$BODY .= fread($FILEPIPE, $FILESIZE);
fclose($FILEPIPE);
$BODY .= "\r\n";
}
$BODY .= "--{$BOUNDARY}--";
return $BODY;
}
//Word of warning, IP is for debugging, do not include the IP of your user without the knowledge that your user may not user your application afterword.
//$_POST['IP'] = $_SERVER['HTTP_PC_REMOTE_ADDR']!="" ? $_SERVER['HTTP_PC_REMOTE_ADDR'] : $_SERVER['REMOTE_ADDR'];
$_POST['User_Agent'] = urldecode($_SERVER['HTTP_USER_AGENT']);
if ($_POST['GRType']=="crash") {
unset($_POST['GRType']);
$email = $_POST['GREmail'];
unset($_POST['GREmail']);
$subject = $_POST['GRSubject'];
unset($_POST['GRSubject']);
$userReport = isset($_POST['GRUserReport']) ? trim($_POST['GRUserReport']) : "";
unset($_POST['GRUserReport']);
$boundary = "--Boundary+".rand(0, 100000);
if ($_POST['GRReportAttached']=="NO") {
if (isset($_FILES['reportFile'])) {
$filePipe = fopen($_FILES['reportFile']['tmp_name'], "r");
$reportFileContents = fread($filePipe, $_FILES['reportFile']['size']);
fclose($filePipe);
unset($_FILES['reportFile']);
$_POST['Report'] = "\n\n".$reportFileContents;
}
}
unset($_POST['GRReportAttached']);
if (preg_match("/([\w\.\-]+)(\@[\w\.\-]+)(\.[a-z]{2,4})+/i", $_POST['User_Email_Address'])) {
$fromEmail = "{$_POST['User_Email_Address']}";
} else {
$fromEmail = "\"Mr. Gecko's Media\" <webmaster@mrgeckosmedia.com>";
}
$headers = "From: {$fromEmail}\r\n";
$headers .= "X-Mailer: GeckoReporter/{$_POST['GRVersion']}\r\n";
unset($_POST['GRVersion']);
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary={$boundary}\r\n\r\n";
$headers .= "--$boundary\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n";
$headers .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$KEYS = array_keys($_POST);
sort($KEYS);
for ($i=0; $i<count($KEYS); $i++) {
$KEY = $KEYS[$i];
$NAME = str_replace("_", " ", $KEY);
$headers .= "{$NAME}: {$_POST[$KEY]}\n";
}
if ($userReport!="")
$headers .= "\nThe user was\n$userReport";
$headers .= buildBody($_FILES, $boundary);
$sent = mail($email, $subject, "This is a multipart message, your email client needs to support mime 1.0 in order to read this message.", $headers);
echo ($sent ? "Crash Report Was Sent" : "Crash Report Was Not Sent");
} else if ($_POST['GRType']=="bug") {
unset($_POST['GRType']);
$email = $_POST['GREmail'];
unset($_POST['GREmail']);
$subject = $_POST['GRSubject'];
unset($_POST['GRSubject']);
$bug = isset($_POST['GRBug']) ? trim($_POST['GRBug']) : "";
unset($_POST['GRBug']);
$reproduce = isset($_POST['GRReproduce']) ? trim($_POST['GRReproduce']) : "";
unset($_POST['GRReproduce']);
$boundary = "--Boundary+".rand(0, 100000);
if (preg_match("/([\w\.\-]+)(\@[\w\.\-]+)(\.[a-z]{2,4})+/i", $_POST['User_Email_Address'])) {
$fromEmail = "{$_POST['User_Email_Address']}";
} else {
$fromEmail = "\"Mr. Gecko's Media\" <webmaster@mrgeckosmedia.com>";
}
$headers = "From: {$fromEmail}\r\n";
$headers .= "X-Mailer: GeckoReporter/{$_POST['GRVersion']}\r\n";
unset($_POST['GRVersion']);
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary={$boundary}\r\n\r\n";
$headers .= "--$boundary\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n";
$headers .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$KEYS = array_keys($_POST);
sort($KEYS);
for ($i=0; $i<count($KEYS); $i++) {
$KEY = $KEYS[$i];
$NAME = str_replace("_", " ", $KEY);
$headers .= "{$NAME}: {$_POST[$KEY]}\n";
}
if ($bug!="")
$headers .= "\nThe Bug\n$bug\n";
if ($reproduce!="")
$headers .= "\nHow you can reproduce it\n$reproduce\n";
$headers .= buildBody($_FILES, $boundary);
$sent = mail($email, $subject, "This is a multipart message, your email client needs to support mime 1.0 in order to read this message.", $headers);
echo ($sent ? "Bug Report Was Sent" : "Bug Report Was Not Sent");
} else if ($_POST['GRType']=="contact") {
unset($_POST['GRType']);
$email = $_POST['GREmail'];
unset($_POST['GREmail']);
$subject = $_POST['GRSubject'];
unset($_POST['GRSubject']);
$message = isset($_POST['GRMessage']) ? trim($_POST['GRMessage']) : "";
unset($_POST['GRMessage']);
$boundary = "--Boundary+".rand(0, 100000);
if (preg_match("/([\w\.\-]+)(\@[\w\.\-]+)(\.[a-z]{2,4})+/i", $_POST['User_Email_Address'])) {
$fromEmail = "\"{$_POST['User_Name']}\" <{$_POST['User_Email_Address']}>";
} else {
$fromEmail = "\"Mr. Gecko's Media\" <webmaster@mrgeckosmedia.com>";
}
$headers = "From: {$fromEmail}\r\n";
$headers .= "X-Mailer: GeckoReporter/{$_POST['GRVersion']}\r\n";
unset($_POST['GRVersion']);
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary={$boundary}\r\n\r\n";
$headers .= "--$boundary\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n";
$headers .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$KEYS = array_keys($_POST);
sort($KEYS);
for ($i=0; $i<count($KEYS); $i++) {
$KEY = $KEYS[$i];
$NAME = str_replace("_", " ", $KEY);
$headers .= "{$NAME}: {$_POST[$KEY]}\n";
}
if ($message!="")
$headers .= "\nThe message\n$message\n";
$headers .= buildBody($_FILES, $boundary);
$sent = mail($email, $subject, "This is a multipart message, your email client needs to support mime 1.0 in order to read this message.", $headers);
echo ($sent ? "Message Was Sent" : "Message Was Not Sent");
}
?>
Loading…
Cancel
Save