GeckoReporter Start
This commit is contained in:
commit
3002113549
12
Classes/Framework/GeckoReporter.h
Normal file
12
Classes/Framework/GeckoReporter.h
Normal file
@ -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
Normal file
26
Classes/Framework/MGMBugWindow.h
Normal file
@ -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
Normal file
83
Classes/Framework/MGMBugWindow.m
Normal file
@ -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
Normal file
27
Classes/Framework/MGMContactWindow.h
Normal file
@ -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
Normal file
95
Classes/Framework/MGMContactWindow.m
Normal file
@ -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
Normal file
16
Classes/Framework/MGMFeedback.h
Normal file
@ -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
Normal file
20
Classes/Framework/MGMFeedback.m
Normal file
@ -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
Normal file
11
Classes/Framework/MGMLocalized.h
Normal file
@ -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
Normal file
12
Classes/Framework/MGMLog.h
Normal file
@ -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
Normal file
92
Classes/Framework/MGMLog.m
Normal file
@ -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
Normal file
42
Classes/Framework/MGMReportWindow.h
Normal file
@ -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
Normal file
136
Classes/Framework/MGMReportWindow.m
Normal file
@ -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
Normal file
28
Classes/Framework/MGMReporter.h
Normal file
@ -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
Normal file
113
Classes/Framework/MGMReporter.m
Normal file
@ -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
Normal file
20
Classes/Framework/MGMSender.h
Normal file
@ -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
Normal file
391
Classes/Framework/MGMSender.m
Normal file
@ -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
Normal file
15
Classes/Framework/MGMSenderDelegate.h
Normal file
@ -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
Normal file
37
Classes/Framework/MGMSystemInfo.h
Normal file
@ -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
Normal file
255
Classes/Framework/MGMSystemInfo.m
Normal file
@ -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
Normal file
19
Classes/Test/MGMController.h
Normal file
@ -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
Normal file
32
Classes/Test/MGMController.m
Normal file
@ -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
Normal file
50
GeckoReporter Test-Info.plist
Normal file
@ -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'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
Normal file
30
GeckoReporter-Info.plist
Normal file
@ -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'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
Normal file
7376
GeckoReporter.ai
Normal file
File diff suppressed because one or more lines are too long
BIN
GeckoReporter.icns
Normal file
BIN
GeckoReporter.icns
Normal file
Binary file not shown.
601
GeckoReporter.xcodeproj/grmrgecko.pbxuser
Normal file
601
GeckoReporter.xcodeproj/grmrgecko.pbxuser
Normal file
@ -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
Normal file
1603
GeckoReporter.xcodeproj/grmrgecko.perspectivev3
Normal file
File diff suppressed because it is too large
Load Diff
654
GeckoReporter.xcodeproj/project.pbxproj
Normal file
654
GeckoReporter.xcodeproj/project.pbxproj
Normal file
@ -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
Normal file
22
License.txt
Normal file
@ -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
Normal file
13
Prefix.pch
Normal file
@ -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
Normal file
15
ReadMe.txt
Normal file
@ -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
Normal file
BIN
Resources/Framework/English.lproj/GeckoReporter.strings
Normal file
Binary file not shown.
1414
Resources/Framework/English.lproj/MGMBugWindow.xib
Normal file
1414
Resources/Framework/English.lproj/MGMBugWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
1442
Resources/Framework/English.lproj/MGMContactWindow.xib
Normal file
1442
Resources/Framework/English.lproj/MGMContactWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
2846
Resources/Framework/English.lproj/MGMReportWindow.xib
Normal file
2846
Resources/Framework/English.lproj/MGMReportWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
206
Resources/Framework/ModelNames.plist
Normal file
206
Resources/Framework/ModelNames.plist
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>ADP2,1</key>
|
||||||
|
<string>Developer Transition Kit</string>
|
||||||
|
<key>iMac1,1</key>
|
||||||
|
<string>iMac G3 (Rev A-D)</string>
|
||||||
|
<key>PowerMac2,1</key>
|
||||||
|
<string>iMac G3 (Slot-loading CD-ROM)</string>
|
||||||
|
<key>PowerMac2,2</key>
|
||||||
|
<string>iMac G3 (Summer 2000)</string>
|
||||||
|
<key>PowerMac4,1</key>
|
||||||
|
<string>iMac G3 (2001)</string>
|
||||||
|
<key>PowerMac4,2</key>
|
||||||
|
<string>iMac G4 (Flat Panel)</string>
|
||||||
|
<key>PowerMac4,5</key>
|
||||||
|
<string>iMac G4 (17" Flat Panel)</string>
|
||||||
|
<key>PowerMac6,1</key>
|
||||||
|
<string>iMac G4 (USB 2.0)</string>
|
||||||
|
<key>PowerMac6,3</key>
|
||||||
|
<string>iMac G4 (20" Flat Panel)</string>
|
||||||
|
<key>PowerMac8,1</key>
|
||||||
|
<string>iMac G5</string>
|
||||||
|
<key>PowerMac8,2</key>
|
||||||
|
<string>iMac G5 (Ambient Light Sensor)</string>
|
||||||
|
<key>PowerMac12,1</key>
|
||||||
|
<string>iMac G5 (iSight)</string>
|
||||||
|
<key>iMac4,1</key>
|
||||||
|
<string>iMac (Core Duo)</string>
|
||||||
|
<key>iMac4,2</key>
|
||||||
|
<string>iMac for Education (17" Core Duo)</string>
|
||||||
|
<key>iMac5,1</key>
|
||||||
|
<string>iMac (Core 2 Duo 17"/20" SuperDrive)</string>
|
||||||
|
<key>iMac5,2</key>
|
||||||
|
<string>iMac (Core 2 Duo 17" Combo Drive)</string>
|
||||||
|
<key>iMac6,1</key>
|
||||||
|
<string>iMac (Core 2 Duo 24" SuperDrive)</string>
|
||||||
|
<key>iMac7,1</key>
|
||||||
|
<string>iMac (AI)</string>
|
||||||
|
<key>iMac8,1</key>
|
||||||
|
<string>iMac (2008)</string>
|
||||||
|
<key>iMac9,1</key>
|
||||||
|
<string>iMac (2009)</string>
|
||||||
|
<key>iMac10,1</key>
|
||||||
|
<string>iMac (2009 Magic)</string>
|
||||||
|
<key>iMac11,1</key>
|
||||||
|
<string>iMac (2009 Core I5)</string>
|
||||||
|
<key>PowerMac4,4</key>
|
||||||
|
<string>eMac</string>
|
||||||
|
<key>PowerMac6,4</key>
|
||||||
|
<string>eMac (USB 2.0 2005)</string>
|
||||||
|
<key>PowerMac10,1</key>
|
||||||
|
<string>Mac Mini G4</string>
|
||||||
|
<key>PowerMac10,2</key>
|
||||||
|
<string>Mac Mini (2005)</string>
|
||||||
|
<key>Macmini1,1</key>
|
||||||
|
<string>Mac Mini (Core Solo/Duo)</string>
|
||||||
|
<key>Macmini2,1</key>
|
||||||
|
<string>Mac Mini (Core 2 Duo)</string>
|
||||||
|
<key>Macmini3,1</key>
|
||||||
|
<string>Mac Mini (2009)</string>
|
||||||
|
<key>PowerBook2,1</key>
|
||||||
|
<string>iBook G3</string>
|
||||||
|
<key>PowerBook2,2</key>
|
||||||
|
<string>iBook G3 (FireWire)</string>
|
||||||
|
<key>PowerBook2,3</key>
|
||||||
|
<string>iBook G3</string>
|
||||||
|
<key>PowerBook2,4</key>
|
||||||
|
<string>iBook G3</string>
|
||||||
|
<key>PowerBook4,1</key>
|
||||||
|
<string>iBook G3 (Dual USB 2001)</string>
|
||||||
|
<key>PowerBook4,2</key>
|
||||||
|
<string>iBook G3 (16MB VRAM)</string>
|
||||||
|
<key>PowerBook4,3</key>
|
||||||
|
<string>iBook G3 Opaque 16MB VRAM/32MB VRAM 2003)</string>
|
||||||
|
<key>PowerBook6,3</key>
|
||||||
|
<string>iBook G4</string>
|
||||||
|
<key>PowerBook6,5</key>
|
||||||
|
<string>iBook G4 (2004)</string>
|
||||||
|
<key>PowerBook6,7</key>
|
||||||
|
<string>iBook G4 (Mid 2005)</string>
|
||||||
|
<key>PowerBook1,1</key>
|
||||||
|
<string>PowerBook G3</string>
|
||||||
|
<key>PowerBook3,1</key>
|
||||||
|
<string>PowerBook G3 (FireWire)</string>
|
||||||
|
<key>PowerBook3,2</key>
|
||||||
|
<string>PowerBook G4</string>
|
||||||
|
<key>PowerBook3,3</key>
|
||||||
|
<string>PowerBook G4 (Gigabit Ethernet)</string>
|
||||||
|
<key>PowerBook3,4</key>
|
||||||
|
<string>PowerBook G4 (DVI)</string>
|
||||||
|
<key>PowerBook3,5</key>
|
||||||
|
<string>PowerBook G4 (1GHz/867MHz)</string>
|
||||||
|
<key>PowerBook5,1</key>
|
||||||
|
<string>PowerBook G4 (17")</string>
|
||||||
|
<key>PowerBook5,2</key>
|
||||||
|
<string>PowerBook G4 (15" FW 800)</string>
|
||||||
|
<key>PowerBook5,3</key>
|
||||||
|
<string>PowerBook G4 (17" 1.33GHz)</string>
|
||||||
|
<key>PowerBook5,4</key>
|
||||||
|
<string>PowerBook G4 (15" 1.5/1.33GHz)</string>
|
||||||
|
<key>PowerBook5,5</key>
|
||||||
|
<string>PowerBook G4 (17" 1.5GHz)</string>
|
||||||
|
<key>PowerBook5,6</key>
|
||||||
|
<string>PowerBook G4 (15" 1.67GHz/1.5GHz)</string>
|
||||||
|
<key>PowerBook5,7</key>
|
||||||
|
<string>PowerBook G4 (17" 1.67GHz)</string>
|
||||||
|
<key>PowerBook5,8</key>
|
||||||
|
<string>PowerBook G4 (Double layer SD 15")</string>
|
||||||
|
<key>PowerBook5,9</key>
|
||||||
|
<string>PowerBook G4 (Double layer SD 17")</string>
|
||||||
|
<key>PowerBook6,1</key>
|
||||||
|
<string>PowerBook G4 (12")</string>
|
||||||
|
<key>PowerBook6,2</key>
|
||||||
|
<string>PowerBook G4 (12" DVI)</string>
|
||||||
|
<key>PowerBook6,4</key>
|
||||||
|
<string>PowerBook G4 (12" 1.33GHz)</string>
|
||||||
|
<key>PowerBook6,8</key>
|
||||||
|
<string>PowerBook G4 (12" 1.5GHz)</string>
|
||||||
|
<key>MacBook1,1</key>
|
||||||
|
<string>MacBook (Core Duo)</string>
|
||||||
|
<key>MacBook2,1</key>
|
||||||
|
<string>MacBook (Core 2 Duo)</string>
|
||||||
|
<key>MacBook4,1</key>
|
||||||
|
<string>MacBook (2008)</string>
|
||||||
|
<key>MacBook5,1</key>
|
||||||
|
<string>MacBook (Unibody)</string>
|
||||||
|
<key>MacBook5,2</key>
|
||||||
|
<string>MacBook (White 2009)</string>
|
||||||
|
<key>MacBook6,1</key>
|
||||||
|
<string>MacBook (White Unibody)</string>
|
||||||
|
<key>MacBookAir1,1</key>
|
||||||
|
<string>MacBook Air (2008)</string>
|
||||||
|
<key>MacBookPro1,1</key>
|
||||||
|
<string>MacBook Pro Core Duo (15")</string>
|
||||||
|
<key>MacBookPro1,2</key>
|
||||||
|
<string>MacBook Pro Core Duo (17")</string>
|
||||||
|
<key>MacBookPro2,1</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (17")</string>
|
||||||
|
<key>MacBookPro2,2</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (15")</string>
|
||||||
|
<key>MacBookPro3,1</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (15" LED Core 2 Duo)</string>
|
||||||
|
<key>MacBookPro3,2</key>
|
||||||
|
<string>MacBook Pro Core 2 Duo (17" HD Core 2 Duo)</string>
|
||||||
|
<key>MacBookPro4,1</key>
|
||||||
|
<string>MacBook Pro (Core 2 Duo 2008)</string>
|
||||||
|
<key>MacBookPro5,1</key>
|
||||||
|
<string>MacBook Pro (Unibody)</string>
|
||||||
|
<key>MacBookPro5,2</key>
|
||||||
|
<string>MacBook Pro (Unibody 17" 2009)</string>
|
||||||
|
<key>MacBookPro5,3</key>
|
||||||
|
<string>MacBook Pro (Unibody 15" 2009)</string>
|
||||||
|
<key>MacBookPro5,4</key>
|
||||||
|
<string>MacBook Pro (Unibody 15" 2009)</string>
|
||||||
|
<key>MacBookPro5,5</key>
|
||||||
|
<string>MacBook Pro (Unibody 13" 2009)</string>
|
||||||
|
<key>PowerMac1,1</key>
|
||||||
|
<string>Power Macintosh G3 (Blue & White)</string>
|
||||||
|
<key>PowerMac1,2</key>
|
||||||
|
<string>Power Macintosh G4 (PCI Graphics)</string>
|
||||||
|
<key>PowerMac11,2</key>
|
||||||
|
<string>Power Macintosh G5 (2005)</string>
|
||||||
|
<key>PowerMac3,1</key>
|
||||||
|
<string>Power Macintosh G4 (AGP Graphics)</string>
|
||||||
|
<key>PowerMac3,2</key>
|
||||||
|
<string>Power Macintosh G4 (AGP Graphics)</string>
|
||||||
|
<key>PowerMac3,3</key>
|
||||||
|
<string>Power Macintosh G4 (Gigabit Ethernet)</string>
|
||||||
|
<key>PowerMac3,4</key>
|
||||||
|
<string>Power Macintosh G4 (Digital Audio)</string>
|
||||||
|
<key>PowerMac3,5</key>
|
||||||
|
<string>Power Macintosh G4 (Quick Silver)</string>
|
||||||
|
<key>PowerMac3,6</key>
|
||||||
|
<string>Power Macintosh G4 (Mirrored Drive Door)</string>
|
||||||
|
<key>PowerMac5,1</key>
|
||||||
|
<string>Power Macintosh G4 Cube</string>
|
||||||
|
<key>PowerMac7,2</key>
|
||||||
|
<string>Power Macintosh G5</string>
|
||||||
|
<key>PowerMac7,3</key>
|
||||||
|
<string>Power Macintosh G5</string>
|
||||||
|
<key>PowerMac9,1</key>
|
||||||
|
<string>Power Macintosh G5 (2005)</string>
|
||||||
|
<key>MacPro1,1</key>
|
||||||
|
<string>Mac Pro (Four-Core)</string>
|
||||||
|
<key>MacPro2,1</key>
|
||||||
|
<string>Mac Pro (Eight-Core)</string>
|
||||||
|
<key>MacPro3,1</key>
|
||||||
|
<string>Mac Pro (2008 4/8 core "Harpertown")</string>
|
||||||
|
<key>MacPro4,1</key>
|
||||||
|
<string>Mac Pro (2009 "Nehalem")</string>
|
||||||
|
<key>RackMac1,1</key>
|
||||||
|
<string>Xserve G4</string>
|
||||||
|
<key>RackMac1,2</key>
|
||||||
|
<string>Xserve G4 (Slot-loading cluster node)</string>
|
||||||
|
<key>RackMac3,1</key>
|
||||||
|
<string>Xserve G5</string>
|
||||||
|
<key>Xserve1,1</key>
|
||||||
|
<string>Xserve (Intel Xeon)</string>
|
||||||
|
<key>Xserve2,1</key>
|
||||||
|
<string>Xserve (2008 Quad-Core)</string>
|
||||||
|
<key>Xserve3,1</key>
|
||||||
|
<string>Xserve (2009 Quad-Core)</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
BIN
Resources/Framework/es.lproj/GeckoReporter.strings
Normal file
BIN
Resources/Framework/es.lproj/GeckoReporter.strings
Normal file
Binary file not shown.
1414
Resources/Framework/es.lproj/MGMBugWindow.xib
Normal file
1414
Resources/Framework/es.lproj/MGMBugWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
1442
Resources/Framework/es.lproj/MGMContactWindow.xib
Normal file
1442
Resources/Framework/es.lproj/MGMContactWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
2847
Resources/Framework/es.lproj/MGMReportWindow.xib
Normal file
2847
Resources/Framework/es.lproj/MGMReportWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Resources/Framework/pt_PT.lproj/GeckoReporter.strings
Normal file
BIN
Resources/Framework/pt_PT.lproj/GeckoReporter.strings
Normal file
Binary file not shown.
1414
Resources/Framework/pt_PT.lproj/MGMBugWindow.xib
Normal file
1414
Resources/Framework/pt_PT.lproj/MGMBugWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
1442
Resources/Framework/pt_PT.lproj/MGMContactWindow.xib
Normal file
1442
Resources/Framework/pt_PT.lproj/MGMContactWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
2846
Resources/Framework/pt_PT.lproj/MGMReportWindow.xib
Normal file
2846
Resources/Framework/pt_PT.lproj/MGMReportWindow.xib
Normal file
File diff suppressed because it is too large
Load Diff
1
Resources/Test/English.lproj/InfoPlist.strings
Normal file
1
Resources/Test/English.lproj/InfoPlist.strings
Normal file
@ -0,0 +1 @@
|
|||||||
|
/* Localized versions of Info.plist keys */
|
4399
Resources/Test/English.lproj/MainMenu.xib
Normal file
4399
Resources/Test/English.lproj/MainMenu.xib
Normal file
File diff suppressed because it is too large
Load Diff
4399
Resources/Test/es.lproj/MainMenu.xib
Normal file
4399
Resources/Test/es.lproj/MainMenu.xib
Normal file
File diff suppressed because it is too large
Load Diff
4399
Resources/Test/pt_PT.lproj/MainMenu.xib
Normal file
4399
Resources/Test/pt_PT.lproj/MainMenu.xib
Normal file
File diff suppressed because it is too large
Load Diff
13
main.m
Normal file
13
main.m
Normal file
@ -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
Normal file
174
sendreport.php
Normal file
@ -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…
Reference in New Issue
Block a user