From d8bb3b07eb190d62684e3b39d71ed7ce9d34dc5c Mon Sep 17 00:00:00 2001 From: Thomas Dohmke Date: Sat, 3 Dec 2011 16:19:14 +0100 Subject: [PATCH] Removed dependeny to JMC.h and use NSInvocation instead. --- Classes/CNSHockeyManager.h | 5 +- Classes/CNSHockeyManager.m | 110 +++++++++++++++++++++++++++++-------- 2 files changed, 91 insertions(+), 24 deletions(-) diff --git a/Classes/CNSHockeyManager.h b/Classes/CNSHockeyManager.h index c99bdb7dc3..6c30b5176b 100644 --- a/Classes/CNSHockeyManager.h +++ b/Classes/CNSHockeyManager.h @@ -20,7 +20,10 @@ // THE SOFTWARE. -@interface CNSHockeyManager : NSObject +@interface CNSHockeyManager : NSObject { +@private + NSString *appIdentifier; +} + (CNSHockeyManager *)sharedHockeyManager; diff --git a/Classes/CNSHockeyManager.m b/Classes/CNSHockeyManager.m index 1e44130325..061b02a09d 100644 --- a/Classes/CNSHockeyManager.m +++ b/Classes/CNSHockeyManager.m @@ -23,15 +23,9 @@ #import "BWQuincyManager.h" #import "BWHockeyManager.h" -#ifdef JMC_PRESENT -#import "JMC.h" -#endif - @interface CNSHockeyManager () -#ifdef JMC_PRESENT - (void)configureJMC; -#endif @end @@ -65,7 +59,62 @@ } #endif -- (void)configureWithIdentifier:(NSString *)appIdentifier delegate:(id)delegate { ++ (BOOL)isJMCActive { + id jmcClass = NSClassFromString(@"JMC"); + id jmcInstance = [jmcClass performSelector:@selector(instance)]; + + return (jmcInstance) && ([jmcInstance performSelector:@selector(url)]); +} + ++ (BOOL)isJMCPresent { + id jmcClass = NSClassFromString(@"JMC"); + return (jmcClass) && ([jmcClass respondsToSelector:@selector(instance)]); +} + ++ (void)disableJMCCrashReporter { + id jmcClass = NSClassFromString(@"JMC"); + id jmcInstance = [jmcClass performSelector:@selector(instance)]; + id jmcOptions = [jmcInstance performSelector:@selector(options)]; + SEL crashReporterSelector = @selector(setCrashReportingEnabled:); + + BOOL value = NO; + + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[jmcOptions methodSignatureForSelector:crashReporterSelector]]; + invocation.target = jmcOptions; + invocation.selector = crashReporterSelector; + [invocation setArgument:&value atIndex:2]; + [invocation invoke]; +} + ++ (BOOL)checkJMCConfiguration:(NSDictionary *)configuration { + return (([[configuration valueForKey:@"enabled"] boolValue]) && + ([[configuration valueForKey:@"url"] length] > 0) && + ([[configuration valueForKey:@"key"] length] > 0) && + ([[configuration valueForKey:@"project"] length] > 0)); +} + ++ (void)applyJMCConfiguration:(NSDictionary *)configuration { + id jmcClass = NSClassFromString(@"JMC"); + id jmcInstance = [jmcClass performSelector:@selector(instance)]; + SEL configureSelector = @selector(configureJiraConnect:projectKey:apiKey:); + + NSString *url = [configuration valueForKey:@"url"]; + NSString *project = [configuration valueForKey:@"project"]; + NSString *key = [configuration valueForKey:@"key"]; + + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[jmcInstance methodSignatureForSelector:configureSelector]]; + invocation.target = jmcInstance; + invocation.selector = configureSelector; + [invocation setArgument:&url atIndex:2]; + [invocation setArgument:&project atIndex:3]; + [invocation setArgument:&key atIndex:4]; + [invocation invoke]; +} + +- (void)configureWithIdentifier:(NSString *)newAppIdentifier delegate:(id)delegate { + [appIdentifier release]; + appIdentifier = [newAppIdentifier copy]; + // Crash Reporting [[BWQuincyManager sharedQuincyManager] setAppIdentifier:appIdentifier]; @@ -73,38 +122,53 @@ [[BWHockeyManager sharedHockeyManager] setAppIdentifier:appIdentifier]; [[BWHockeyManager sharedHockeyManager] setCheckForTracker:YES]; -#ifdef JMC_PRESENT // JMC - [[[JMC instance] options] setCrashReportingEnabled:NO]; - [[BWHockeyManager sharedHockeyManager] addObserver:self forKeyPath:@"trackerConfig" options:0 context:nil]; - [self performSelector:@selector(configureJMC) withObject:nil afterDelay:0]; -#endif + if ([[self class] isJMCPresent]) { + [[BWHockeyManager sharedHockeyManager] addObserver:self forKeyPath:@"trackerConfig" options:0 context:nil]; + [[self class] disableJMCCrashReporter]; + [self performSelector:@selector(configureJMC) withObject:nil afterDelay:0]; + } } -#ifdef JMC_PRESENT - (void)configureJMC { // Return if JMC is already configured - if ([[JMC instance] url]) { + if ([[self class] isJMCActive]) { + return; + } + + // Return if app id is nil + if (!appIdentifier) { return; } // Configure JMC from user defaults - NSDictionary *config = [[NSUserDefaults standardUserDefaults] valueForKey:@"CNSTrackerConfig"]; - if (([[config valueForKey:@"enabled"] boolValue]) && - ([[config valueForKey:@"url"] length] > 0) && - ([[config valueForKey:@"key"] length] > 0) && - ([[config valueForKey:@"project"] length] > 0)) { - [[JMC instance] configureJiraConnect:[config valueForKey:@"url"] projectKey:[config valueForKey:@"project"] apiKey:[config valueForKey:@"key"]]; + NSDictionary *configurations = [[NSUserDefaults standardUserDefaults] valueForKey:@"CNSTrackerConfigurations"]; + NSDictionary *configuration = [configurations valueForKey:appIdentifier]; + if ([[self class] checkJMCConfiguration:configuration]) { + [[self class] applyJMCConfiguration:configuration]; } } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([object trackerConfig]) { - [[NSUserDefaults standardUserDefaults] setValue:[object trackerConfig] forKey:@"CNSTrackerConfig"]; - [[NSUserDefaults standardUserDefaults] synchronize]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSMutableDictionary *trackerConfig = [[defaults valueForKey:@"CNSTrackerConfigurations"] mutableCopy]; + if (!trackerConfig) { + trackerConfig = [[NSMutableDictionary dictionaryWithCapacity:1] retain]; + } + + [trackerConfig setValue:[object trackerConfig] forKey:appIdentifier]; + [defaults setValue:trackerConfig forKey:@"CNSTrackerConfigurations"]; + [trackerConfig release]; + + [defaults synchronize]; [self configureJMC]; } } -#endif + +- (void)dealloc { + [appIdentifier release], appIdentifier = nil; + [super dealloc]; +} @end