113 lines
4.3 KiB
Mathematica
113 lines
4.3 KiB
Mathematica
|
//
|
||
|
// 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
|