Running auto-configuration whenever computer wakes up or network change is detected
Change-Id: I2af25aa61a9d5dedb6c30f62f7157c15ba843895
diff --git a/osx/system-events.mm b/osx/system-events.mm
new file mode 100644
index 0000000..b7297f8
--- /dev/null
+++ b/osx/system-events.mm
@@ -0,0 +1,85 @@
+/* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * @copyright See LICENCE for copyright and license information.
+ *
+ * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * @author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+/*
+ Potentially useful System Configuration regex patterns:
+
+ (backslash quoting below is only to protect the C comment)
+ State:/Network/Interface/.*\/Link
+ State:/Network/Interface/.*\/IPv4
+ State:/Network/Interface/.*\/IPv6
+
+ State:/Network/Global/DNS
+ State:/Network/Global/IPv4
+
+ Potentially useful notifications from Darwin Notify Center:
+
+ com.apple.system.config.network_change
+*/
+
+#import "system-events.h"
+#import "menu-delegate.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <SystemConfiguration/SystemConfiguration.h>
+
+@implementation SystemEvents
+
+-(void)scheduleDaemonRestart
+{
+ [NSTimer scheduledTimerWithTimeInterval: 3.0
+ target: (MenuDelegate*)[[NSApplication sharedApplication] delegate]
+ selector:@selector(restartDaemon:)
+ userInfo: nil
+ repeats:NO];
+}
+
+- (void)wakeUpNotification:(NSNotification*) note
+{
+ [self scheduleDaemonRestart];
+}
+
+static void
+NotificationCenterCallback(CFNotificationCenterRef center,
+ void *observer,
+ CFStringRef name,
+ const void *object,
+ CFDictionaryRef userInfo)
+{
+ [(__bridge SystemEvents*)observer scheduleDaemonRestart];
+}
+
+-(id)init
+{
+ if (![super init]) {
+ return nil;
+ }
+
+ [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
+ selector: @selector(wakeUpNotification:)
+ name: NSWorkspaceDidWakeNotification object: NULL];
+
+ CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
+ (__bridge void*)self,
+ NotificationCenterCallback,
+ CFSTR ("com.apple.system.config.network_change"), // name of notification
+ NULL, // object to observe
+ NSNotificationSuspensionBehaviorDeliverImmediately);
+
+ return self;
+}
+
+-(void)disable
+{
+ [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
+
+ CFNotificationCenterRemoveEveryObserver(CFNotificationCenterGetDarwinNotifyCenter(),
+ (__bridge void*)self);
+}
+
+@end